ServiceProvider не разрешает зависимость, возвращая ноль - PullRequest
0 голосов
/ 07 ноября 2018

Я не могу понять, почему 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; }
...