ASP.NET Core MediatR ошибка: зарегистрируйте ваши обработчики с контейнером - PullRequest
0 голосов
/ 09 июня 2018

У меня есть приложение .Net Core, в котором я использую расширение .AddMediatR, чтобы зарегистрировать сборку для моих команд и обработчиков в соответствии с подходом CQRS.

В ConfigureServices в Startup.cs я использовал метод расширенияиз официального пакета MediatR.Extensions.Microsoft.DependencyInjection со следующим параметром:

services.AddMediatR(typeof(AddEducationCommand).GetTypeInfo().Assembly);  

Классы команды и обработчика команд следующие:

AddEducationCommand.cs

public class AddEducationCommand : IRequest<bool>
{
    [DataMember]
    public int UniversityId { get; set; }

    [DataMember]
    public int FacultyId { get; set; }

    [DataMember]
    public string Name { get; set; }
}

AddEducationCommandHandler.cs

public class AddEducationCommandHandler : IRequestHandler<AddEducationCommand, bool>
    {
        private readonly IUniversityRepository _repository;
        public AddEducationCommandHandler(IUniversityRepository repository)
        {
            _repository = repository;
        }

        public async Task<bool> Handle(AddEducationCommand command, CancellationToken cancellationToken)
        {
            var university = await _repository.GetAsync(command.UniversityId);

            university.Faculties
                .FirstOrDefault(f => f.Id == command.FacultyId)
                .CreateEducation(command.Name);

            return await _repository.UnitOfWork.SaveEntitiesAsync();
        }
    }

Когда я запускаю конечную точку REST, которая выполняет простой код await _mediator.Send(command);, я получаю следующую ошибку из моего журнала:

Error constructing handler for request of type MediatR.IRequestHandler`2[UniversityService.Application.Commands.AddEducationCommand,System.Boolean]. Register your handlers withthe container. See the samples in GitHub for examples.

Я безуспешно пытался просматривать официальные примеры из документов.Кто-нибудь знает, как настроить MediatR для правильной работы?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

У меня была такая же проблема, и в моем случае, когда я регистрировал зависимости, которые нужны определенному обработчику после того, как я вызывал services.AddMediatR(), это была настоящая проблема, после того, как я начал регистрировать свои зависимости перед регистрацией Mediator, все работает нормально.

Я использую dot net core 2.2 с контейнером DI по умолчанию и MediatR 6.0.0.

0 голосов
/ 02 августа 2018

Я встречал ту же проблему.

Проблема в том, что этот строчный код

services.AddMediatR(typeof(AddEducationCommand).GetTypeInfo().Assembly);

обрабатывает все MediatR IRequest и IRequestHandlers.

, но вы создали интерфейс IRepository и егокласс реализации, который не может быть обработан этим MediatR.Extensions.Microsoft.DependencyInjection

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

services.AddScoped(typeof(IUniversityRepository), typeof(UniversitySqlServerRepository));

, затем проблема решена.

...