gpt4 book ai didi

c# - 使 Unity 解决考虑逆变的实现

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:43 27 4
gpt4 key购买 nike

我想将 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 , MsgHandlerObjectHandler .
  • 如果我收到 IMsg , 我应该把它发送到 MsgHandlerObjectHandler .
  • ObjectHandler应该会收到所有消息。

默认情况下,CaSTLe Windsor 无需任何特定配置即可正确处理这种情况(使用 v2.5.1 测试)。

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

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

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

最佳答案

你能不能:

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

但是您可能需要更改一些代码才能使其正常工作。喜欢:

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

关于c# - 使 Unity 解决考虑逆变的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6229976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com