Я не могу понять, почему ServiceProvider не получает экземпляр зарегистрированного сервиса
У меня есть следующая конфигурация DI
_serviceCollection.AddScoped<INotificationMediator, NotificationMediator>();
_serviceCollection.AddScoped<INotificationFactory, NotificationFactory>();
_serviceCollection.AddTransient<INotificationHandler<OrderCreatedEvent>, OrderCreatedEventHandler>();
Это должно получить правильную услугу: но вместо этого возвращает ноль
public class NotificationFactory : INotificationFactory
{
private readonly IServiceProvider _serviceProvider;
public NotificationFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public INotificationHandler<TNotification> GetHandler<TNotification>()
where TNotification : INotification
{
var handler1 = _serviceProvider.GetService(typeof(INotificationHandler<TNotification>));
var handler2 = _serviceProvider.GetService<INotificationHandler<TNotification>>();
return handler2;
}
}
Ниже приводится служба, которую я пытаюсь разрешить
public class OrderCreatedEventHandler : INotificationHandler<OrderCreatedEvent>
{
public Task HandleAsync(OrderCreatedEvent domainEvent, CancellationToken? cancellationToken = null)
{
throw new System.NotImplementedException();
}
}
А это уведомление
public class OrderCreatedEvent : INotification { }
Я подписался на Jbogard MediatR, это ссылка https://github.com/jbogard/MediatR
Что я здесь не так делаю, в чем может быть проблема?
Кстати, я проделал то же самое для обработки вариантов использования, и у меня нет проблем с получением правильного варианта использования. Вместо INotification есть IRequest и логика одинакова для всех остальных частей
То, как я пытаюсь вызвать NotificationFactor, GetHandler использует NotificationMediator
public class NotificationMediator : INotificationMediator
{
private readonly INotificationFactory _notificationFactory;
public NotificationMediator(INotificationFactory notificationFactory)
{
_notificationFactory = notificationFactory;
}
public Task DispatchAsync<TNotification>(TNotification notification, CancellationToken? cancellationToken = null)
where TNotification : INotification
{
INotificationHandler<TNotification> notificationHandler = _notificationFactory.GetHandler<TNotification>();
return notificationHandler.HandleAsync(notification, cancellationToken);
}
}
И это называется вот так
aggregate.Events.ForEach(domainEvent => _eventHandler.DispatchAsync(domainEvent));
И совокупность. Событие представляет собой список INotifications
public virtual List<INotification> Events { get => _events; }