Настройка 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.0MediatR.Extensions.Microsoft.DependencyInjection
версия 6.0.1
PS Для тех, у кого минусы - подойдет любой класс из сборки. я использовал GetAccountListQuery
в качестве примера, потому что это точно внутри правильной сборки. Смотрите мои комментарии ниже.