C#を使用してActiveDirectoryを使用しています。オブジェクトのインスタンス化はPrincipalContext
コストがかかるように思われるので、クラス変数に格納したいと思います。
ローカル変数として使用PrincipalContext
する場合、便利なusing
構文を使用できます。オブジェクトを静的変数に格納する場合IDisposable
、オブジェクトが適切に破棄されるようにするにはどうすればよいですか?
C#を使用してActiveDirectoryを使用しています。オブジェクトのインスタンス化はPrincipalContext
コストがかかるように思われるので、クラス変数に格納したいと思います。
ローカル変数として使用PrincipalContext
する場合、便利なusing
構文を使用できます。オブジェクトを静的変数に格納する場合IDisposable
、オブジェクトが適切に破棄されるようにするにはどうすればよいですか?
このための一般的なパターンはIDisposable
、クラスにインターフェースを実装することです。この例を見てください:
public class YourClass : IDisposable
{
private OtherDisposableType yourResource;
public YourClass()
{
yourResource = new OtherDisposableType();
}
public void Dispose()
{
yourResource.Dispose();
}
}
これは、少なくとも、あなたがする必要があることです。
編集
私の以前のバージョンは、すべての場合にファイナライザーパターンに従うことを提唱しましたが、これはフレームワークの設計ガイドラインに違反していることが(正しく)指摘されていました。ただし、実際に管理されていないリソースを処理している場合(たとえば、直接P / Invoke呼び出しを行い、明示的に解放する必要のあるハンドルを取得している場合)、ファイナライザーを作成し、そのDispose
中で呼び出しを行うことをお勧めします。あなたのコードを消費し、電話をかけない人々から保護しますDispose
:
public class YourClass : IDisposable
{
private OtherDisposableType yourResource;
public YourClass()
{
yourResource = new OtherDisposableType();
}
public void Dispose()
{
yourResource.Dispose();
GC.SuppressFinalize(this);
}
~YourClass()
{
Dispose();
}
}
System.ComponentModel
名前空間の機能を見てください。基本的に、私が通常使用するパターンは、サブコンポーネントのコレクションを持つことです。これには、実装するかどうかに関係なく、私が所有する「値」ではないすべてが含まれますIDisposable
。
次に、私自身が、このコレクションとを実装するすべてのものDispose()
を反復処理します。Dispose
IDisposable
この手法の利点の 1 つは、私が所有するオブジェクトが最初は Disposable ではなく、後でIDisposable
インターフェイスを追加した場合、私のクラスは変更する必要なく正しいことを行うことです。
また、DI/IoC コンテナーを使用すると、これらの多くを処理できます。
したがって、基本的には高価なリソースをキャッシュする必要があります。それはいい。
グローバルデータ(この場合は静的変数)はあまり良いものではありません. 代わりに、インスタンス変数にして寿命を制御してみませんか?
AD の責任を処理するクラスを作成し、そのクラスで PrincipalContext を作成して使用し、IDisposable にもします ( Dispose パターンを使用)。そこからインターフェイスを抽出して分離し、それを使用するクラスをテストしやすくします。
AD サービスを使用するクラスは、新しいインターフェイス (依存性注入または DI) のコンストラクター パラメーターを受け取ります。using ブロックで手動でクラスを作成してクラスに渡すか、DI Container Frameworkを使用することができます。フレームワークで AD オブジェクトの有効期間をコンテナーの有効期間に設定することができます (IDisposable の場合もあります)。IDisposable と IoC をどのように調整しますか? を参照してください。詳細については、DI コンテナーのドキュメントを参照してください。