4

コンパイル時に型がわからないため、いくつかのオブジェクト型のプロパティを持つメッセージを MT で発行します。コンシューマーでメッセージを受け取ると、オブジェクト型のプロパティに Newtonsoft JObject インスタンスが設定されていることがわかります。JObject クラスは、Masstransit.dll の ILMerged Newtonsoft.Json アセンブリにあります。このアセンブリの JObject-Class は internal とマークされています。Newtonsoft.Json の Nuget-Assembly によって提供される JObject にプロパティ値をキャストしようとすると、常に失敗します。

だから私の質問は:

  • プロパティ値をJObjectにキャストする正しい方法は何ですか?
  • キャストが失敗するのはなぜですか?つまり、ここでclrが抱えている困難は何ですか?
  • コンシューマーで未加工のシリアル化されていないメッセージ本文を取得できますか?

ありがとうございました。

4

3 に答える 3

5

メッセージ コントラクトで実行時入力を行っている場合は、JSON シリアル化を使用できません。これを行うには、バイナリ シリアライザーを使用する必要があります。

生のシリアル化されていないメッセージ本文にはアクセスできません。メッセージを逆シリアル化できない場合、ユーザー コードは呼び出されません。

internal とマークされた型があると、メッセージを逆シリアル化できません。コンストラクターを呼び出すことができないため、オブジェクトは作成されません。私がテストしたものではなく、バイナリシリアライザーでこの制限を回避できるかどうかはわかりません。

他に質問がある場合は、https://groups.google.com/forum/# !forum/masstransit-discuss のメーリング リストにも参加してください。

于 2012-02-06T17:43:32.380 に答える
2

MassTransit の作成者の 1 人として、

public object MyMessageProperty { get; set; }

メッセージ コントラクトでは、間違っています。MT 内のパブリッシュ/サブスクライブ システムによって既に行われているディスパッチに加えて、独自の動的ディスパッチを行う代わりに、フレームワークの強く型付けされたパブリッシング機能を活用します。

于 2012-02-07T14:19:35.930 に答える
0

上記の問題は、おそらく私のメッセージング システムの誤解から生じたものです。しかし、ネストされた JObjects を適切なドメイン オブジェクトに変換する厄介な回避策を見つけました。

protected bool TryConvertJObjectToDtoOfType<T>(Object jObjectInDisguise, out T dto)
     where T: BpnDto
{
    try
    {
         if (jObjectInDisguise.GetType().Name != typeof(JObject).Name)
             throw new ArgumentException("Object isn't a JObject", "jObjectInDisguise");

        var json = jObjectInDisguise.ToString();
        var settings = new JsonSerializerSettings()
        {
            MissingMemberHandling = MissingMemberHandling.Error
        };

        dto = JsonConvert.DeserializeObject<T>(json, settings);
        return true;
    } catch
    {
        dto = null;
        return false;
    }
}
于 2012-02-07T09:40:42.583 に答える