0

我已经定义了一条消息,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();
}

使用 fluent API 获取 IBus 时,调用 CreateBus() 时出现以下异常;

System.TypeLoadException:“来自程序集'Contracts _impl,Version = 0.0.0.0,Culture = Neutral,PublicKeyToken = null'的'Contracts.IProposer_impl'类型中的方法'DoSomething'没有实现。”:“Contracts.IProposer__impl”

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

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

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

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

4

1 回答 1

1

NSB 发送的消息定义了两个端点之间的契约或模式。这不包括行为,而只是数据。NSB 将处理接口继承,但它正确地警告您向接口添加行为。

于 2013-03-26T12:29:51.327 回答