C# 考虑到逆差,制定统一解决方案

C# 考虑到逆差,制定统一解决方案,c#,polymorphism,unity-container,contravariance,C#,Polymorphism,Unity Container,Contravariance,我想将unity用于多态事件聚合/处理,其中处理程序是通过容器注册的 处理程序使用“in”修饰符声明泛型参数,因为它仅用作输入参数。所以参数是逆变的 考虑以下示例 接口IHandler{void Handle(T message);} 接口IMsg{string Message{get;}} 类MsgA:IMsg{…} 类MsgB:IMsg{…} 类MsgAHandler:IHandler{ 公共无效句柄(MsgA msg){…} } 类MsgBHandler:IHandler{ 公共无效句柄(

我想将unity用于多态事件聚合/处理,其中处理程序是通过容器注册的

处理程序使用“in”修饰符声明泛型参数,因为它仅用作输入参数。所以参数是逆变的

考虑以下示例

接口IHandler{void Handle(T message);}
接口IMsg{string Message{get;}}
类MsgA:IMsg{…}
类MsgB:IMsg{…}
类MsgAHandler:IHandler{
公共无效句柄(MsgA msg){…}
}
类MsgBHandler:IHandler{
公共无效句柄(MsgB msg){…}
}
MsgHandler类:IHandler{
公共无效句柄(IMsg msg){…}
}
类ObjectHandler:IHandler{
公共无效句柄(对象消息){…}
}
班级活动{
公共无效发布(T消息){
//实际上,这段代码对于Unity来说更复杂,因为它首先尝试
//使用.resolve()解析默认注册的组件,
//然后使用.ResolveAll()解析所有命名组件
foreach(此.container.ResolveAll()中的var处理程序){
handler.Handle(消息);
}
}
}
我的期望如下:

  • 如果我收到
    MsgA
    ,我应该将其发送到
    MsgAHandler
    MsgHandler
    ObjectHandler
  • 如果我收到
    IMsg
    ,我应该将其发送到
    MsgHandler
    ObjectHandler
  • ObjectHandler
    应接收所有消息
默认情况下,Castle Windsor无需任何特定配置即可正确处理此场景(使用v2.5.1进行测试)

Unity是否公开了一种提高分辨率的方法,并允许
Resolve()
也匹配实现
IHandle
IHandle
的任何类型

我使用UnityExtensions(匹配规则、策略等)查找示例,但没有成功

有人能告诉我如何使用正确的机制来实现这样的场景吗?

您能做到:

container.RegisterType(typeof(IHandle<>), typeof(MsgAHandler<>))
container.RegisterType(typeof(IHandle),typeof(MsgAHandler))
但是您可能需要更改一些代码才能正常工作。比如:

public interface IHandler<in THandler> where THandler : class, IMsg
{ void Handle(THandler message); }
公共接口IHandler,其中THandler:class,IMsg
{无效句柄(THandler消息);}