我想使用unity来进行多态事件聚合/处理,其中处理程序通过容器注册。
处理程序使用“in”修饰符声明泛型参数,因为它仅用作输入参数。所以参数是逆变的。
考虑以下样本。
interface IHandler<in T> { void Handle(T message); }
interface IMsg { string Message { get; } }
class MsgA : IMsg { ... }
class MsgB : IMsg { ... }
class MsgAHandler : IHandler<MsgA> {
public void Handle(MsgA msg) { ... }
}
class MsgBHandler : IHandler<MsgB> {
public void Handle(MsgB msg) { ... }
}
class MsgHandler : IHandler<IMsg> {
public void Handle(IMsg msg) { ... }
}
class ObjectHandler : IHandler<object> {
public void Handle(object msg) { ... }
}
class Events {
public void Publish<T>(T message) {
// Actually this code is more complex for Unity, because it first tries to
// resolve the default registered component using .Resolve(),
// then use .ResolveAll() to resolve all named components
foreach (var handler in this.container.ResolveAll<IHandle<T>>()) {
handler.Handle(message);
}
}
}
我的期望如下:
MsgA
,我应该将其发送给MsgAHandler
,MsgHandler
和ObjectHandler
。IMsg
,我应将其发送至MsgHandler
和ObjectHandler
。ObjectHandler
应该会收到所有邮件。默认情况下,Castle Windsor在没有任何特定配置的情况下正确处理此场景(使用v2.5.1测试)。
Unity是否提供了一种增强解决方案的方法,并允许Resolve<IHandle<MsgA>>()
匹配实施IHandle<IMsg>
或IHandle<object>
的任何类型?
我使用UnityExtensions(匹配规则,政策等)查找了示例但没有成功。
有人可以指导我使用正确的机制来实现这种情况吗?
答案 0 :(得分:1)
你能做到:
container.RegisterType(typeof(IHandle<>), typeof(MsgAHandler<>))
但您可能需要更改一些代码才能正常工作。像:
public interface IHandler<in THandler> where THandler : class, IMsg
{ void Handle(THandler message); }