Как подключен Mediatr? - PullRequest
       99

Как подключен Mediatr?

0 голосов
/ 31 октября 2019

Обновление:

Медиатр в проекте используется без какой-либо настраиваемой логики для отправки сообщений. Могу ли я сказать, что он используется в качестве агрегатора событий?


В исходном коде https://github.com/JasonGT/NorthwindTraders, Контроллер получает Медиатор из ControllerBase.

[ApiController]
[Route("api/[controller]/[action]")]
public abstract class BaseController : ControllerBase
{
    private IMediator _mediator;

    protected IMediator Mediator => _mediator ??= HttpContext.RequestServices.GetService<IMediator>();
}

Вконтроллер вызывает Mediator.Send(...) для отправки сообщения посреднику.

public class EmployeesController : BaseController
{
    // ....
    [HttpGet("{id}")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public async Task<ActionResult<EmployeeDetailVm>> Get(int id)
    {
        return Ok(await Mediator.Send(new GetEmployeeDetailQuery { Id = id }));
    }

И метод Handle() во внутреннем классе GetEmployeeDetailQuery.GetEmployeeDetailQueryHandler будет вызываться для сообщения запроса GetEmployeeDetailQuery. Как это проводной?

public class GetEmployeeDetailQuery : IRequest<EmployeeDetailVm>
{
    public int Id { get; set; }

    public class GetEmployeeDetailQueryHandler : IRequestHandler<GetEmployeeDetailQuery, EmployeeDetailVm>
    {
        private readonly INorthwindDbContext _context;
        private readonly IMapper _mapper;

        public GetEmployeeDetailQueryHandler(INorthwindDbContext context, IMapper mapper)
        {
            _context = context;
            _mapper = mapper;
        }

        public async Task<EmployeeDetailVm> Handle(GetEmployeeDetailQuery request, CancellationToken cancellationToken)
        {
            var vm = await _context.Employees
                .Where(e => e.EmployeeId == request.Id)
                .ProjectTo<EmployeeDetailVm>(_mapper.ConfigurationProvider)
                .SingleOrDefaultAsync(cancellationToken);

            return vm;
        }
    }
}

1 Ответ

1 голос
/ 31 октября 2019

В файле startup.cs этого проекта есть вызов AddApplication, который является методом расширения из проекта NorthwindTraders.Application и определен в DependencyInjection.cs . Это вызывает services.AddMediatR(Assembly.GetExecutingAssembly());, который сканирует сборку на наличие обработчиков и регистрирует их.

В общем, вы можете зарегистрировать MediatR для своих собственных проектов, вызвав services.AddMediatr(Assembly.GetExecutingAssembly()) в методе Startup.ConfigureServices вашего веб-приложения.

...