Настройка MediatR для общей библиотеки классов в консоли против WebAPI

У меня есть библиотека классов.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 может зарегистрировать их для меня в консольном приложении, но не в WebAPI? Есть ли лучший метод?

Я видел этот пост, в котором рекомендуется сканирование сборок, однако он озадачивает меня тем, что мое консольное приложение, похоже, делает это автоматически. Также я не уверен, что хочу переехать в Autofac только что. Я видел несколько пакетов, которые помогут вам сделать то же самое со стандартным ServiceProvider - однако я действительно хочу избегать добавления дополнительных зависимостей, если это не является абсолютно необходимым.

1 ответ

Решение

Этого должно быть достаточно, чтобы иметь это:

services.AddMediatR(typeof(GetAccountListQuery));

или просто

services.AddMediatR(typeof(Startup));

У меня работает ASP.NET Core 2.2. В проекте есть эти два NuGet зависимости:

  • MediatR версия 6.0.0
  • MediatR.Extensions.Microsoft.DependencyInjection версия 6.0.1

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

Другие вопросы по тегам