使用autofac在ASP.NET Core 3中注册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.CheckUserNameExistValidation2[Command.UserCommands.CreateUserCommand,Common.Operation.OperationResult1[System.String]]不是开放的泛型类型定义。位于Autofac.Features.OpenGenerics.OpenGenericaRegistrationExtensions.RegisterGeneric(ContainerBuilder构建器,类型实现器(位于Autofac.RegistrationExtensions.RegisterGeneric(ContainerBuilder生成器,类型实现器(在Framework.Configuration.AutofacConfiguration.AutoInjectServices(ContainerBuilder容器(

出了什么问题?我该如何解决这个问题?

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>>>();

最新更新