遵循此解释的最简单方法是NServiceBus Pub / Sub示例,其中包含“多态订阅”(Subscriber2)的示例。
消息:(无更改)
public class EventMessage : IEvent
{
public Guid EventId { get; set; }
public DateTime? Time { get; set; }
public TimeSpan Duration { get; set; }
}
public interface IEvent : IMessage
{
Guid EventId { get; set; }
DateTime? Time { get; set; }
TimeSpan Duration { get; set; }
}
处理程序:(不做更改)
public class EventMessageHandler : IHandleMessages<IEvent>
{
public void Handle(IEvent message)
{
// ...
}
}
此处理程序将同时收到IEvent
和EventMessage
条消息。但如果我要让IEvent成为一个类......
public class IEvent : IMessage
{
Guid EventId { get; set; }
DateTime? Time { get; set; }
TimeSpan Duration { get; set; }
}
...然后我将无法接收 EventMessage
,但会像以前一样收到IEvent
所以我找到了这样一个简单的规则:如果你在IHandleMessages中使用接口&lt;&gt; - 它会工作,如果上课 - 它将无法正常工作。目前我将所有消息作为类,我想订阅父类消息,以便接收所有子类消息。
这是预期的行为吗?
答案 0 :(得分:3)
这一切都是为了实现多重继承而设计的。这样做的原因详见here。建议将业务组件之间公开可用的事件建模为接口,建议将业务组件中的命令建模为类。听起来你想要这种行为,我会切换到接口。