Настройка MediatR для общей библиотеки классов в консоли против WebAPI - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть библиотека классов .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 - однако я действительно хочу избегать добавления дополнительных зависимостей, если это не является абсолютно необходимым.

1 Ответ

0 голосов
/ 29 декабря 2018

Достаточно просто иметь это:

services.AddMediatR(typeof(GetAccountListQuery));

или просто

services.AddMediatR(typeof(Startup));

Это работает для меня в ASP.NET Core 2.2.Проект имеет следующие две NuGet зависимости:

PS Для тех, у кого минусы - подойдет любой класс из сборки.Я использовал GetAccountListQuery в качестве примера, потому что он точно внутри правильной сборки.Смотрите мои комментарии ниже.

...