Mediator, Fluent Validation & OneOf, как сделать pipeline?

Для создания пайплайна с использованием Mediator, Fluent Validation и OneOf в C#, вы можете использовать следующий подход:

Шаг 1: Установка пакетов

Первым делом вам необходимо установить следующие пакеты NuGet:

- MediatR: Это пакет, который предоставляет реализацию паттерна Mediator в C#.
- FluentValidation: Этот пакет предоставляет возможность добавления валидации входных данных в пайплайн.
- OneOf: Пакет, который предоставляет удобный способ обрабатывать вариантные типы данных.

Шаг 2: Создание запроса и обработчика

Создайте класс для вашего запроса:

public class MyRequest : IRequest<OneOf<MyResponse, Error>>
{
    // Поля или свойства вашего запроса
}

Затем создайте обработчик, который будет получать этот запрос и выполнять необходимую логику:

public class MyRequestHandler : IRequestHandler<MyRequest, OneOf<MyResponse, Error>>
{
    private readonly IValidator<MyRequest> _validator;

    public MyRequestHandler(IValidator<MyRequest> validator)
    {
        _validator = validator;
    }

    public async Task<OneOf<MyResponse, Error>> Handle(MyRequest request, CancellationToken cancellationToken)
    {
        // Проверяем валидность входных данных
        var validationResult = await _validator.ValidateAsync(request);
        if (!validationResult.IsValid)
        {
            var errors = validationResult.Errors.Select(e => e.ErrorMessage);
            return new Error(errors);
        }

        // Логика обработки запроса
        // ...

        // Возвращаем результат обработки
        return new MyResponse();
    }
}

Шаг 3: Создание валидатора

Создайте класс валидатора, который будет проверять входные данные вашего запроса:

public class MyRequestValidator : AbstractValidator<MyRequest>
{
    public MyRequestValidator()
    {
        // Настройка правил валидации
        // ...
    }
}

Шаг 4: Настройка Mediator и Fluent Validation

В вашем классе Startup (или аналогичном классе), выполните необходимые настройки для Mediator и FluentValidation:

services.AddMediatR(typeof(Startup));
services.AddValidatorsFromAssembly(typeof(Startup).Assembly);

Шаг 5: Использование пайплайна

Теперь вы можете использовать ваш пайплайн в контроллере или другом месте вашего приложения. Пример ниже показывает, как создать экземпляр запроса и передать его в Mediator:

public class MyController : ControllerBase
{
    private readonly IMediator _mediator;

    public MyController(IMediator mediator)
    {
        _mediator = mediator;
    }

    public async Task<IActionResult> MyAction()
    {
        var request = new MyRequest
        {
            // Заполните поля вашего запроса
        };

        var response = await _mediator.Send(request);

        if (response.IsT0)
        {
            var result = response.AsT0;
            // Обработка успешного результата
            return Ok(result);
        }
        else
        {
            var error = response.AsT1;
            // Обработка ошибки
            return BadRequest(error.ErrorMessage);
        }
    }
}

Таким образом, пайплайн с использованием Mediator, Fluent Validation и OneOf позволяет легко организовать обработку запросов с валидацией и возвратом разных результатов в зависимости от успеха или ошибки.