使用 autofac 在 ASP.NET Core 3 中注册 IPipelineBehavior
Register IPipelineBehavior in ASP.NET Core 3 with autofac
我想在我的项目中注册管道行为并通过 autofac 注册。
我是这样实现的:
public class CheckUserNameExistValidation<TRequest, TResponse> : IPipelineBehavior<CreateUserCommand, OperationResult<string>>
{
private readonly IDomainUnitOfWork unitOfWork;
public CheckUserNameExistValidation(IDomainUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public async Task<OperationResult<string>> Handle(CreateUserCommand request, CancellationToken cancellationToken, RequestHandlerDelegate<OperationResult<string>> next)
{
var findUserName = await unitOfWork.UsersRepository.GetUserByUsernameAsync(request.Username, cancellationToken);
if (findUserName.Result != null)
{
return OperationResult<string>.BuildFailure("UserName Exist");
}
return await next();
}
}
我通过这种方式在这个 autofac 中注册了这个管道:
container.RegisterGeneric(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>)).
As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));
但是当我 运行 项目时,它向我显示了这个错误:
System.ArgumentException: The type BehaviorHandler.PipeLineBehaviors.RegisterUserBehavior.CheckUserNameExistValidation2[Command.UserCommands.CreateUserCommand,Common.Operation.OperationResult
1[System.String]] is not an open generic type definition.
at Autofac.Features.OpenGenerics.OpenGenericRegistrationExtensions.RegisterGeneric(ContainerBuilder builder, Type implementor)
at Autofac.RegistrationExtensions.RegisterGeneric(ContainerBuilder builder, Type implementer)
at Framework.Configuration.AutofacConfiguration.AutoInjectServices(ContainerBuilder container)
有什么问题吗?我该如何解决这个问题?
RegisterGeneric
用于开放泛型注册,您可以在其中注册泛型类型 而无需 指定泛型类型参数。
但这不是你在这里做的。您正在注册 IPipelineBehavior<CreateUserCommand, OperationResult<string>>
这是一个非常具体的类型。它是通用的,但它指定了类型参数,因此它与任何其他非通用类型一样。
这意味着您必须使用常规 RegisterType
方法:
container.RegisterType(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>))
.As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));
当然你也可以使用通用版的Register
然后:
container.RegisterType<CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>>()
.As<IPipelineBehavior<CreateUserCommand, OperationResult<string>>>();
我想在我的项目中注册管道行为并通过 autofac 注册。
我是这样实现的:
public class CheckUserNameExistValidation<TRequest, TResponse> : IPipelineBehavior<CreateUserCommand, OperationResult<string>>
{
private readonly IDomainUnitOfWork unitOfWork;
public CheckUserNameExistValidation(IDomainUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public async Task<OperationResult<string>> Handle(CreateUserCommand request, CancellationToken cancellationToken, RequestHandlerDelegate<OperationResult<string>> next)
{
var findUserName = await unitOfWork.UsersRepository.GetUserByUsernameAsync(request.Username, cancellationToken);
if (findUserName.Result != null)
{
return OperationResult<string>.BuildFailure("UserName Exist");
}
return await next();
}
}
我通过这种方式在这个 autofac 中注册了这个管道:
container.RegisterGeneric(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>)).
As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));
但是当我 运行 项目时,它向我显示了这个错误:
System.ArgumentException: The type BehaviorHandler.PipeLineBehaviors.RegisterUserBehavior.CheckUserNameExistValidation
2[Command.UserCommands.CreateUserCommand,Common.Operation.OperationResult
1[System.String]] is not an open generic type definition. at Autofac.Features.OpenGenerics.OpenGenericRegistrationExtensions.RegisterGeneric(ContainerBuilder builder, Type implementor) at Autofac.RegistrationExtensions.RegisterGeneric(ContainerBuilder builder, Type implementer) at Framework.Configuration.AutofacConfiguration.AutoInjectServices(ContainerBuilder container)
有什么问题吗?我该如何解决这个问题?
RegisterGeneric
用于开放泛型注册,您可以在其中注册泛型类型 而无需 指定泛型类型参数。
但这不是你在这里做的。您正在注册 IPipelineBehavior<CreateUserCommand, OperationResult<string>>
这是一个非常具体的类型。它是通用的,但它指定了类型参数,因此它与任何其他非通用类型一样。
这意味着您必须使用常规 RegisterType
方法:
container.RegisterType(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>))
.As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));
当然你也可以使用通用版的Register
然后:
container.RegisterType<CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>>()
.As<IPipelineBehavior<CreateUserCommand, OperationResult<string>>>();