Microsoft依赖注入和矛盾

时间:2019-02-28 09:22:47

标签: c# dependency-injection .net-core polymorphism contravariance

我要将库移植到网络核心。现在,我们有了内置的DI,我想尽可能地利用它。

我的库将事件从后端代理到信号器客户端,它包含一个框架,用于在将事件发送到特定客户端之前对其进行验证。我的旧库支持矛盾,因此如果需要,一个事件处理程序可以支持所有事件。考虑一下

public class ContravariantHandler : IEventHandler<BaseEvent>
{
    public void Handle(BaseEvent message)
    {

    }
}

public abstract class BaseEvent { }

public class MyEvent : BaseEvent { }
public class MyEvent2 : BaseEvent { }

public interface IEventHandler<in T>
{
    void Handle(T message);
}

在这里做new ContravariantHandler().Handle(new MyEvent());new ContravariantHandler().Handle(new MyEvent2());都很好。

我可以在这里将网芯DI处理为正确的类型吗?

这不起作用,

var provider = new ServiceCollection()
    .AddTransient<IEventHandler<BaseEvent>, ContravariantHandler>()
    .BuildServiceProvider();

var contravariance =  provider.GetService<IEventHandler<MyEvent>>();

1 个答案:

答案 0 :(得分:0)

我可以在这里让网芯DI正确处理吗?

没有任何内置机制,因此不太可能添加。

我们了解这种情况,但是添加对此的支持将使其与其他容器一起使用变得困难。 https://github.com/aspnet/DependencyInjection/issues/453

不过,您可以引入另一个接口,即command = [executable.encode("utf-8").split(b'\x00')] ,解析.encode("utf-8")并检查每个接口的兼容性。不利之处在于,这会导致您激活所有事件处理程序。