我已经定义了一条消息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包含方法,因此无法映射。请注意,非映射接口不能用于发送消息“)。
因此,当您在接口上声明了一个方法时,似乎会发生异常,并且该接口是由消息类型所依赖的类型之一扩展的。这几乎就像动态代理生成没有考虑接口继承。
有谁知道这里发生了什么?
答案 0 :(得分:1)
NSB发送的消息定义了两个端点之间的契约或模式。这不包括行为,而只包括数据。 NSB将处理接口继承,但理所当然它会警告你将behvaviour添加到你的接口。