Зарегистрируйте IPipelineBehavior в ASP. NET Core 3 с помощью автозапуска - PullRequest
0 голосов
/ 26 апреля 2020

Я хочу зарегистрировать поведение конвейера в моем проекте и зарегистрировать его по автофоре c.

Я реализую это следующим образом:

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

и регистрирую этот конвейер в этой автофиле c следующим образом:

 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]] не является определением типа generi c , в Autofa c .Features.OpenGenerics.OpenGenericRegistrationExtensions.RegisterGeneri c (конструктор ContainerBuilder, разработчик типа) в Autofa c .RegistrationExtensions.RegisterGeneri c (средство создания контейнеров. Конфигурация объекта. (Контейнер ContainerBuilder)

В чем проблема? Как я могу решить эту проблему?

1 Ответ

1 голос
/ 26 апреля 2020

RegisterGeneric используется для открытых обобщенных c регистраций, где вы регистрируете обобщенный c тип без указания с указанием аргументов обобщенного c типа.

Но это не то, что вы здесь делаете. Вы регистрируетесь IPipelineBehavior<CreateUserCommand, OperationResult<string>>, что является очень конкретным типом. Это generi c, но для него заданы аргументы типа, поэтому он похож на любой другой не-generi c тип.

Это означает, что вам придется использовать обычный RegisterType method:

container.RegisterType(typeof(CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>))
    .As(typeof(IPipelineBehavior<CreateUserCommand, OperationResult<string>>));

И, конечно, вы также можете использовать обобщенную c версию Register тогда:

container.RegisterType<CheckUserNameExistValidation<CreateUserCommand, OperationResult<string>>>()
    .As<IPipelineBehavior<CreateUserCommand, OperationResult<string>>>();
...