[英]Understanding Asp.net Core Dependency Injection when registering multiple implementations of Mediatr IPipelineBehavior
[英]Register IPipelineBehavior in ASP.NET Core 3 with autofac
我想在我的項目中注冊管道行為並通過 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
用於開放泛型注冊,您可以在其中注冊泛型類型而不指定泛型類型 arguments。
但這不是你在這里做的。 您正在注冊IPipelineBehavior<CreateUserCommand, OperationResult<string>>
這是一個非常具體的類型。 它是通用的,但它指定了 arguments 類型,因此它與任何其他非通用類型一樣。
這意味着您將不得不使用常規的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>>>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.