[英]Register IPipelineBehavior in ASP.NET Core 3 with autofac
I want to register pipeline behavior in my project and register that by autofac.我想在我的项目中注册管道行为并通过 autofac 注册。
I implement that by this way:我通过这种方式实现:
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();
}
}
and I register this pipeline in this autofac by this way:我通过这种方式在这个autofac中注册了这个管道:
container.RegisterGeneric(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>)).
As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));
but when I run the project it show me this error:但是当我运行该项目时,它向我显示了这个错误:
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.System.ArgumentException: BehaviorHandler.PipeLineBehaviors.RegisterUserBehavior.CheckUserNameExistValidation
2[Command.UserCommands.CreateUserCommand,Common.Operation.OperationResult
1[System.String]] 类型不是开放的泛型类型定义。 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)在 Autofac.Features.OpenGenerics.OpenGenericRegistrationExtensions.RegisterGeneric(ContainerBuilder 构建器,类型实现者)在 Autofac.RegistrationExtensions.RegisterGeneric(ContainerBuilder 构建器,类型实现者)在 Framework.Configuration.AutofacConfiguration.AutoInjectServices(ContainerBuilder 容器)
What's the problem?有什么问题? How can I solve this problem?
我怎么解决这个问题?
RegisterGeneric
is used for open generic registrations, where you register a generic type without specifying the generic type arguments. RegisterGeneric
用于开放泛型注册,您可以在其中注册泛型类型而不指定泛型类型 arguments。
But that's not what you are doing here.但这不是你在这里做的。 You are registering
IPipelineBehavior<CreateUserCommand, OperationResult<string>>
which is a very concrete type.您正在注册
IPipelineBehavior<CreateUserCommand, OperationResult<string>>
这是一个非常具体的类型。 It is generic but it has type arguments specified so it is like any other non-generic type.它是通用的,但它指定了 arguments 类型,因此它与任何其他非通用类型一样。
This means that you will have to use the regular RegisterType
method:这意味着您将不得不使用常规的
RegisterType
方法:
container.RegisterType(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>))
.As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));
And of course, you can also use the generic version of Register
then:当然,您也可以使用通用版本的
Register
然后:
container.RegisterType<CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>>()
.As<IPipelineBehavior<CreateUserCommand, OperationResult<string>>>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.