NServiceBus Create Message具有反直觉的具体类型实现,需要繁琐的类型转换

时间:2010-09-14 21:48:12

标签: nservicebus

NServiceBus从接口创建具体的实现类,以用作消息。理论上,这允许从其他消息组成这些消息。实际上允许多重继承。为了演示不一致的行为,我创建了一些测试接口:

public interface ITestBase1
{
    string Property1 { get; set; }
}

public interface ITestBase2 : ITestBase1
{

}

public interface ITestBase3 : ITestBase2
{

}

然后我运行了以下代码:

var types = new[] { typeof(ITestBase1) };

new NServiceBus.MessageInterfaces.MessageMapper.Reflection.MessageMapper().Initialize(types);

var msg = new NServiceBus.MessageInterfaces.MessageMapper.Reflection.MessageMapper().CreateInstance(typeof(ITestBase1));

如果我创建了ITestBase1的具体实现,我会找到我期望的内容。一个属性称为Property1。如果我创建了ITestBase2的具体实现,我发现msg有一个Property1属性。

但是,如果我创建了ITestBase3的具体实现,我会在msg对象上获得两个Property1实现。一个用于ITestBase1,另一个用于ITestBase2接口。这对我来说似乎有点反直觉。我希望基本消息上的Property1实现的数量不会变化。这使得在尝试使用组件构建消息时非常困惑。

如果没有修改messageserpper.GetAllProperties nservicebus的代码有没有解决这种问题的方法?我宁愿不让其他接口创建相同数据类型和名称的新属性。

2 个答案:

答案 0 :(得分:0)

我对具体实现目的的理解是:

  1. 因此订阅服务中不需要实现,
  2. 可以方便地创建简单的消息,例如:

    Bus.Publish<IMyMessage>(m => { m.Property1 = "My Value"; });

  3. 我正在努力设想一个你需要直接创建自己的实例的场景。你能详细说明你在这做什么吗?

答案 1 :(得分:0)

这可能是VS错误。我有一个层次结构如下:IProductCreatedEvent:IProductChangedEvent:IEvent:IMessage。使用您的代码我在VS调试器中看到您描述的行为:

alt text

但如果你反思这个类型,属性会正确显示:

alt text

如果我转换为IEvent并设置属性,一切都按预期工作。因此,尽管调试器显示的是运行时正在查看类型,因此您可以继续以这种方式为消息建模。