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

问题描述 投票:0回答:1

我想在我的项目中注册管道行为并通过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.CheckUserNameExistValidation2[Command.UserCommands.CreateUserCommand,Common.Operation.OperationResult1[System.String]]不是一个开放的通用类型定义。 在Autofac.Features.OpenGenerics.OpenGenericRegistrationExtensions.RegisterGeneric(ContainerBuilder builder, Type implementor) 在Framework.Configuration.AutofacConfiguration.AutoInjectServices(ContainerBuilder container)

有什么问题?如何解决这个问题?

c# asp.net asp.net-core autofac mediatr
1个回答
1
投票

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>>>();
© www.soinside.com 2019 - 2024. All rights reserved.