简体   繁体   English

使用 autofac 在 ASP.NET Core 3 中注册 IPipelineBehavior

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM