【发布时间】:2019-07-22 03:52:57
【问题描述】:
我正在将一个库移植到网络核心。我们现在有内置的 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>>();
【问题讨论】:
-
通过在接口定义中指定BaseEvent你已经关闭了泛型,你应该使用开放类型注册:stackoverflow.com/questions/35342472/…
-
您正在尝试注册一个 open 通用实现。这意味着您必须改用
.AddTransient(typeof(IEventHandler<>), typeof(ContravariantHandler))。 -
它没有打开,IEventHandler
标签: c# dependency-injection .net-core polymorphism contravariance