首页 > 解决方案 > 在 ASP.NET Core 3 中使用 autofac 注册 IPipelineBehavior

问题描述

我想在我的项目中注册管道行为并通过 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: BehaviorHandler.PipeLineBehaviors.RegisterUserBehavior.CheckUserNameExistValidation 2[Command.UserCommands.CreateUserCommand,Common.Operation.OperationResult1[System.String]] 类型不是开放的泛型类型定义。在 Autofac.Features.OpenGenerics.OpenGenericRegistrationExtensions.RegisterGeneric(ContainerBuilder 构建器,类型实现者)在 Autofac.RegistrationExtensions.RegisterGeneric(ContainerBuilder 构建器,类型实现者)在 Framework.Configuration.AutofacConfiguration.AutoInjectServices(ContainerBuilder 容器)

有什么问题?我怎么解决这个问题?

标签: c#asp.netasp.net-coreautofacmediatr

解决方案


RegisterGeneric用于开放泛型注册,您可以在指定泛型类型参数的情况下注册泛型类型。

但这不是你在这里做的。您正在注册IPipelineBehavior<CreateUserCommand, OperationResult<string>>这是一个非常具体的类型。它是泛型的,但它指定了类型参数,因此它与任何其他非泛型类型一样。

这意味着您将不得不使用常规RegisterType方法:

container.RegisterType(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>))
    .As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));

当然,您也可以使用Registerthen 的通用版本:

container.RegisterType<CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>>()
    .As<IPipelineBehavior<CreateUserCommand, OperationResult<string>>>();

推荐阅读