NServiceBus中的多态订阅仅适用于接口?

时间:2010-10-05 15:17:17

标签: nservicebus

遵循此解释的最简单方法是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)
    {
        // ...
    }
}

此处理程序将同时收到IEventEventMessage条消息。但如果我要让IEvent成为一个类......

public class IEvent : IMessage
{
    Guid EventId { get; set; }
    DateTime? Time { get; set; }
    TimeSpan Duration { get; set; }
}

...然后我将无法接收 EventMessage,但会像以前一样收到IEvent

所以我找到了这样一个简单的规则:如果你在IHandleMessages中使用接口&lt;&gt; - 它会工作,如果上课 - 它将无法正常工作。目前我将所有消息作为类,我想订阅父类消息,以便接收所有子类消息。

这是预期的行为吗?

1 个答案:

答案 0 :(得分:3)

这一切都是为了实现多重继承而设计的。这样做的原因详见here。建议将业务组件之间公开可用的事件建模为接口,建议将业务组件中的命令建模为类。听起来你想要这种行为,我会切换到接口。