c# - 在 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.OperationResult
1[System.String]] 类型不是开放的泛型类型定义。在 Autofac.Features.OpenGenerics.OpenGenericRegistrationExtensions.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
then 的通用版本:
container.RegisterType<CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>>()
.As<IPipelineBehavior<CreateUserCommand, OperationResult<string>>>();
推荐阅读
- javascript - 如何解决 React 中带有复选框的数组设置?
- python - 从crontab调用scrapy项目时如何避免“找不到模块”错误?
- android - 比较来自 EditText 的值
- reactjs - 将路由器切换为交换机/嵌套路由?
- python - “StructType”对象没有属性“toDDL”
- python - 如何解决此错误:AttributeError: 'NoneType' object has no attribute 'write_audiofile'
- javascript - 正则表达式 JS 在 JS 中没有输出
- javascript - 使用纯javascript循环嵌套对象数组时出错
- javascript - 在括号上的 JavaScript 中遇到问题
- java - 使用spring客户端删除RabbitMQ中的所有队列