最近、Dynamics CRM 2011 で 1 つのプラグインの実行 (つまり、Execute()
メソッドのパス) が同じスレッドにとどまることが保証されているかどうかという質問がいくつか出てきました。
Ambient Context パターンを使用してトレースを実装し、トレースが必要なクラスにトレース サービスを渡さないようにしたいと考えています。問題は、私たちが知っているように、プラグインは登録されたステップごとに 1 回だけインスタンス化され、同じインスタンスから後続のすべての操作を提供することです。つまり、現在のインスタンスTracing.Current
を割り当てるような静的プロパティを持つことはできず、問題ありません。ITracingService
私がそれを行った場合、最後に開始された操作は、まだ実行されている可能性のある他のすべての操作のインスタンスを上書きします (この種の同時実行は珍しくありません)。
メソッドの下のすべてが同じスレッドに残っていることを確認できれば、静的フィールドExecute()
の属性を利用してアンビエント コンテキストを使用できます。[ThreadStatic]
public static class Tracing
{
[ThreadStatic]
private static ITracingService _current;
public static ITracingService Current
{
get
{
if (null == _current)
{
_current = new NullTracingService();
}
return _current;
}
set { _current = value; }
}
}
メソッドに入るとこれを設定Execute()
し、最後にクリアして、トレース サービス インスタンスへの参照が削除されるようにします。
MSCRMプラグインのコンテキストでのスレッド化について私が知ることができる唯一のことは、明らかに個々のスレッドがThreadPoolから来ているということです.
MSCRM プラグインでスレッド化がどのように処理されるか、またはこの特別なケースで SOLID コードを使用してトレースの分野横断的な懸念をどのようにエレガントに処理できるかについての他のアイデアを持っている人はいますか (AOP/動的傍受はここではオプションではありません)?
ヘルプとポインタをありがとう。