0

NServiceBus で使用するメッセージ IGetQuote を定義しました。以下に、依存する他のタイプとともに示します。

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 メッセージが送信されたときに XML シリアル化を機能させるために、IGetQuote および IProposer などの関連するインターフェイスを実装する型を作成しようとしています。

IProposer が IDriver から継承されないようにインターフェイスを調整すると、問題は解決します。私の最初の結論は、DoSomething メソッドが問題であるに違いないというものでしたが、IProposer に IDriver を再度継承させ、DoSomething メソッドを IProposer に移動すると、例外はスローされません (ただし、「インターフェイス IProposer にはメソッドが含まれているため、インターフェイス IProposer にはメソッドが含まれているため、警告メッセージが表示されます)。マッピングできません。マッピングされていないインターフェースはメッセージの送信に使用できないことに注意してください」)。

そのため、インターフェースで宣言されたメソッドがあり、そのインターフェースがメッセージタイプが依存するタイプの1つによって拡張されている場合に例外が発生するようです。動的プロキシ生成がインターフェイスの継承を考慮していないようです。

ここで何が起こっているか知っている人はいますか?

4

1 に答える 1

1

NSB によって送信されるメッセージは、2 つのエンドポイント間のコントラクトまたはスキーマを定義します。これには動作は含まれませんが、単にデータが含まれます。NSB はインターフェースの継承を処理しますが、当然のことながら、インターフェースに動作を追加することについて警告します。

于 2013-03-26T12:29:51.327 に答える