C# 服务提供商不';无法解析依赖项,返回null

C# 服务提供商不';无法解析依赖项,返回null,c#,.net,dependency-injection,mediator,C#,.net,Dependency Injection,Mediator,我不明白为什么ServiceProvider没有获得注册服务的实例 我有以下DI配置 _serviceCollection.AddScoped<INotificationMediator, NotificationMediator>(); _serviceCollection.AddScoped<INotificationFactory, NotificationFactory>(); _serviceCollection.AddTransient<INotific

我不明白为什么ServiceProvider没有获得注册服务的实例

我有以下DI配置

_serviceCollection.AddScoped<INotificationMediator, NotificationMediator>();
_serviceCollection.AddScoped<INotificationFactory, NotificationFactory>();
_serviceCollection.AddTransient<INotificationHandler<OrderCreatedEvent>, OrderCreatedEventHandler>();
我关注了Jbogard MediatR,这是链接

我做错了什么,可能是什么问题

顺便说一句,对于用例Handleing,我也做了同样的工作,而且我在获得正确的用例方面没有问题。除了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是一个INotifications列表

public virtual List<INotification> Events { get => _events; }
公共虚拟列表事件{get=>\u Events;}

我认为这可以归结为这样一个事实:在本例中,您最终请求的是
INotificationHandler
的实例,而不是特定的
INotificationHandler
的实例。这里有相当数量的间接和泛型,所以如果不亲自尝试,我不能100%确定。在调用
DispatchAsync
时,
domainEvent
被键入为
INotification
,我记得一些关于泛型的事情不是那样多态的……你是对的,我用INotification替换了OrderCreatedEvent,事实上它给了我一个实例。但是我怎么能以另一种方式来做呢?我的意思是传递一个INotification类型,而不是INotification本身?thanks@MCR,至少有两种可能的选择。首先,您可以通过一些相关的枚举来解析处理程序,而不是通过INotification类型。您的INotification可以类似于接口INotification{NotificationType Type{get;}},其中枚举NotificationType{OrderCreated,OrderRemoved}。然后解析一个处理程序:_notificationFactory.GetHandler(notification.Type)。第二个选项是使用访问者模式。代码应该包含以下接口:接口INotification{void HandleBy(IHandler handle);},接口IHandler{void Process(T item),其中T:INotification;}。然后您可以创建特定的通知:public类OrderCreatedEvent:INotification{public void HandleBy(IHandler handler){handler.Process(this);}
public class OrderCreatedEvent : INotification { }
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));
public virtual List<INotification> Events { get => _events; }