为什么NServiceBus在使用XML序列化时不能为我的消息创建代理?

时间:2013-03-25 22:06:38

标签: nservicebus

我已经定义了一条消息IGetQuote,用于NServiceBus。它如下所示,与其依赖的其他类型相同;

public interface IGetQuote : ICommand
{
    IRisk Risk { get; set; }
}

public interface IRisk
{
    IProposer Proposer { get; }
}

public interface IProposer : IDriver
{
    string Postcode { get; set; }
}

public interface IDriver
{
    string Name { get; set; }
    void DoSomething();
}

使用流畅的API获取IBus时,在调用CreateBus()时会出现以下异常;

System.TypeLoadException:“方法'DoSomething'类型'Contracts.IProposer_ impl'来自程序集'Contracts _impl,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'没有一个实现。“:”Contracts.IProposer__impl“

根据我对NServiceBus工作方式的理解,它正在尝试创建实现IGetQuote的类型以及任何相关的接口,例如IProposer,以便在发送IGetQuote消息时使XML序列化工作。

如果我调整界面以使IProposer不再继承IDriver,问题就会消失。我的初步结论是DoSomething方法必定是问题,但如果我让IProposer再次继承IDriver,并将DoSomething方法移到IProposer上,则不会抛出异常(尽管我收到一条警告消息“Interface IProposer包含方法,因此无法映射。请注意,非映射接口不能用于发送消息“)。

因此,当您在接口上声明了一个方法时,似乎会发生异常,并且该接口是由消息类型所依赖的类型之一扩展的。这几乎就像动态代理生成没有考虑接口继承。

有谁知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

NSB发送的消息定义了两个端点之间的契约或模式。这不包括行为,而只包括数据。 NSB将处理接口继承,但理所当然它会警告你将behvaviour添加到你的接口。