Dynamics CRM 2011 オンプレミス。(ただし、この問題は、Dynamics CRM 以外の多くの状況に存在します。)
CRM プラグインにはエントリ ポイントがあります。
void IPlugin.Execute (IServiceProvider serviceProvider)
( http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.iplugin.execute.aspx )
serviceProvider は、プラグイン実行コンテキストへの参照です。プラグインが行う便利な操作には、serviceProvider またはそのメンバーへのアクセスが必要です。
一部のプラグインは大きく複雑で、複数のクラスが含まれています。たとえば、複数回インスタンス化されるクラスを持つプラグインに取り組んでいます。このクラスは serviceProvider を使用する必要があります。
必要なすべてのクラスから serviceProvider へのアクセスを取得する 1 つの方法は、それらすべてのクラスにプロパティを追加してから、そのプロパティを設定することです。または、各クラスが必要とする serviceProvider の部分のプロパティを追加します。これらのアプローチのいずれも、多くの重複コードが発生します。
もう 1 つの方法は、スレッドのスコープにグローバル変数を設定することです。ただし、 http://msdn.microsoft.com/en-us/library/cc151102.aspxによると、「プラグインでグローバル クラス変数を使用しないでください」。
では、serviceProvider をあちこちに渡さずにアクセスする最善の方法は何でしょうか?
PS例が役立つ場合、 serviceProvider はロギングオブジェクトへのアクセスを提供します。ほとんどすべてのクラスをログに記録したい。ロギング オブジェクトへの参照をすべてのクラスに渡したくありません。