簡體   English   中英

使用 autofac 在 ASP.NET Core 3 中注冊 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM