У меня есть библиотека классов .Net Core 2.2, которая использует шаблон CQRS с MediatR.Я добавляю все свои зависимости в serviceProvider в Main и присоединяю MediatR через:
serviceCollection.AddMediatR();
var serviceProvider = serviceCollection.BuildServiceProvider();
Все работает как чудо, и я могу отправлять любые мои команды или запросы в MediatR в обязательном порядке.
Я хочу использовать ту же самую библиотеку в WebApi (также .Net Core 2.2) и точно так же настроить мой serviceProvider внутри метода Startup.ConfigureServices () , и яполучить следующее исключение при вызове любого контроллера, который использует MediatR:
InvalidOperationException: не найден обработчик для запроса типа MediatR.IRequestHandler`2 [Core.Application.Accounts.Queries.GetAccountListQuery, System.Collections.Generic.List`1 [Core.Application.Accounts.Models.AccountViewModel]].Зарегистрируйте ваши обработчики в контейнере.Смотрите примеры в GitHub.MediatR.Internal.RequestHandlerBase.GetHandler (фабрика ServiceFactory)
Мне удалось решить эту проблему путем явного добавления каждой команды или запроса перед добавлением MediatR в контейнер DI:
services.AddMediatR(typeof(GetAccountListQuery).GetTypeInfo().Assembly);
services.AddMediatR();
Но значит ли это, что я должен регистрировать каждый IRequest объект в моей библиотеке?Как MediatR может зарегистрировать их для меня в приложении Console , но не в WebAPI ?Есть ли лучший метод?
Я видел этот пост , в котором рекомендуется сканирование сборок, однако озадачивает , что мое консольное приложение, похоже, делает это автоматически.Также я не уверен, что хочу перейти на Autofac только сейчас.Я видел несколько пакетов, которые помогут вам сделать то же самое со стандартным ServiceProvider - однако я действительно хочу избегать добавления дополнительных зависимостей, если это не является абсолютно необходимым.