2
我想使用unity來處理通過容器註冊的多態事件聚合/處理。考慮衝突使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(匹配規則,策略等)但沒有成功的示例。
有人能指引我使用正確的機制來實現這樣的場景嗎?