В настоящее время мой метод добавления сервисов MediaTr выглядит так: < /p>
Код: Выделить всё
public static void MediatRServices(this IServiceCollection service)
{
service.AddMediatR(c => c.RegisterServicesFromAssembly(typeof(LoginCommand).Assembly));
service.AddTransient(typeof(IPipelineBehavior), typeof(LoggingBehavior));
// Manually adding handlers for different concrete types
service.AddTransient(typeof(IRequestHandler),
typeof(UpdateServiceHandler));
service.AddTransient(typeof(IRequestHandler),
typeof(UpdateServiceHandler));
service.AddTransient(typeof(IRequestHandler),
typeof(UpdateServiceHandler));
service.AddTransient(typeof(IRequestHandler),
typeof(UpdateServiceHandler));
// Other handlers for different commands...
service.AddTransient(typeof(IRequestHandler),
typeof(UpdateGenericPropertyHandler));
service.AddTransient(typeof(IRequestHandler),
typeof(UpdateGenericPropertyHandler));
service.AddTransient(typeof(IRequestHandler),
typeof(UpdateGenericPropertyHandler));
}
Как показано выше, для каждого общего обработчика мне нужно вручную указать все необходимые типы (например, строка , bool , десятичный и т. Д.). Этот подход не очень хорошо масштабируется, особенно когда количество комбинаций увеличивается. -Верд ">
Код: Выделить всё
services.AddTransient(typeof(IRequestHandler),
typeof(UpdateGenericPropertyHandler));
Код: Выделить всё
IRequestHandler
Я ищу решение, которое легко работает с mediatr при сокращении повторяющихся ручных регистраций. Любые советы или примеры будут очень оценены! Вот какой-то контекст о командах/обработчиках, которые я использую:
Пример команды/обработчика:
Код: Выделить всё
public class UpdateServicePropertyCommand : IRequest
{
public T Value { get; set; }
}
public class UpdateServiceHandler : IRequestHandler
{
public Task Handle(UpdateServicePropertyCommand request, CancellationToken cancellationToken)
{
// Implementation
}
}
< /code>
и аналогично другим командам /обработчикам. < /p>
Дополнительные примечания: < /h3>
Мне известно о библиотеках, таких как Scrutor
Код: Выделить всё
service.AddMediatR(c =>
{
c.RegisterServicesFromAssembly(typeof(LoginCommand).Assembly);
c.MaxTypesClosing = 0; // Set to allow registering all types
c.RegisterGenericHandlers = true;
});
< /code>
Но это привело к следующей ошибке: < /p>
System.ArgumentException: Error registering the generic type: . The total number of generic type registrations exceeds the maximum allowed (125000).
Подробнее здесь: https://stackoverflow.com/questions/794 ... y-defining