2

ディクショナリに値が追加されましたInvocationContextが、次の呼び出しまで保持されません。つまり、インターセプトされたチェーン内の各呼び出しは、 に対して false を返しますInvocationContext.ContainsKey("tracing-id")

public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
    Guid tracingId;

    if (!input.InvocationContext.ContainsKey(TRACING_ID))
    {
        tracingId = _tracingIdProvider.NewTracingId();
        input.InvocationContext.Add(TRACING_ID, tracingId);
    }
    else
    {
        tracingId = (Guid)input.InvocationContext[TRACING_ID];
    }

    var methodReturn = getNext()(input, getNext);

    return methodReturn;
}

にエントリを追加することはできますがInvocationContextgetNext()(input, getNext)が呼び出されて次の呼び出しがインターセプトされると、InvocationContextは空になります。

の使い方を誤解しInvocationContextていますか?もしそうなら、あるメソッド呼び出しから次のメソッド呼び出しまで ID のようなものを永続化する正しい方法は何ですか?

4

1 に答える 1

2

私のテストでは、InvocationContextプロパティの内容が 1 回の呼び出し中にのみ保持されることが示されています。これは、多くの動作が登録されている場合にのみコードが機能することを意味します。それらは同じメソッド呼び出しに対して 1 つずつ呼び出され、InvocationContextデータを共有するために使用できます。ただし、ご覧のとおり、次の通話InvocationContextはクリアされます。

Unity の経験があまりないので、推奨される回避策がわかりません。独自の呼び出しコンテキストを作成し、それをシングルトンとして実装することを検討してください。そのおかげで、すべての呼び出しが同じインスタンスにアクセスでき、TRACING_ID は呼び出し間で保持されます。それはうまくいくはずです。

ただし、問題は、呼び出しコンテキストをいつクリアする必要があるかです。そうしないと、すべての呼び出しが同じ TRACING_ID を持つことになります。意味がありません。たとえば、処理の開始を担当する特定のメソッド (ビジネス シナリオ) が実行されたときに、TRACING_ID をリセットしたい場合があります。

于 2015-01-30T16:35:56.967 に答える