我要将库移植到网络核心。现在,我们有了内置的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>>();
答案 0 :(得分:0)
我可以在这里让网芯DI正确处理吗?
没有任何内置机制,因此不太可能添加。
我们了解这种情况,但是添加对此的支持将使其与其他容器一起使用变得困难。 https://github.com/aspnet/DependencyInjection/issues/453
不过,您可以引入另一个接口,即command = [executable.encode("utf-8").split(b'\x00')]
,解析.encode("utf-8")
并检查每个接口的兼容性。不利之处在于,这会导致您激活所有事件处理程序。