让Unity在考虑差异的情况下解决实施问题

本文关键字:施问题 解决 问题 情况下 Unity | 更新日期: 2023-09-27 17:58:30

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

Handlers使用"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,我应该将它发送到MsgAHandlerMsgHandlerObjectHandler
  • 如果我收到一个IMsg,我应该将它发送到MsgHandlerObjectHandler
  • ObjectHandler应接收所有消息

默认情况下,Castle Windsor可以在没有任何特定配置的情况下正确处理这种情况(用v2.5.1测试)

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

我曾寻找过使用UnityExtensions(匹配规则、策略等)的示例,但没有成功。

有人能指导我使用正确的机制来实现这样的场景吗?

让Unity在考虑差异的情况下解决实施问题

你能做吗:

container.RegisterType(typeof(IHandle<>), typeof(MsgAHandler<>))

但您可能需要更改一些代码才能正常工作。类似:

public interface IHandler<in THandler> where THandler : class, IMsg
{ void Handle(THandler message); }