idisposableオブジェクトをクラス変数にする方法は?
-
19-09-2019 - |
質問
C#を使用してActive Directoryを使用しています。インスタンス化 PrincipalContext
オブジェクトは高価であるように見えるので、クラス変数に1つを保存したいと思います。
使用するとき PrincipalContext
ローカル変数として、私は便利なものを使用できます using
構文。保存するとき IDisposable
静的変数のオブジェクト、オブジェクトが適切に廃棄されるようにするにはどうすればよいですか?
解決
これの一般的なパターンは、を実装することです IDisposable
クラスのインターフェイス。この例を取ります:
public class YourClass : IDisposable
{
private OtherDisposableType yourResource;
public YourClass()
{
yourResource = new OtherDisposableType();
}
public void Dispose()
{
yourResource.Dispose();
}
}
これは、少なくともあなたがする必要があることです。
編集
私の以前のバージョンは、すべての場合におけるファイナルライザーパターンに従って提唱しました。ただし、実際に管理されていないリソースを扱っている場合(たとえば、直接P/呼び出しを行い、明示的に解放する必要があるハンドルを取得する場合) 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
.
次に、i Dispose()
私自身、私はこのコレクションを繰り返します Dispose
実装するものは何でも IDisposable
.
この手法の利点の1つは、私が所有しているオブジェクトが使い捨てではなく、後で追加する場合、 IDisposable
インターフェース、私のクラスは、変更することなく正しいことをします。
また、DI/IOCコンテナを使用すると、これの多くを処理できます。
基本的には、高価なリソースをキャッシュしたいと考えています。それはいい。
グローバルデータ(この場合の静的変数)は、それほど良いことではありません。代わりに、それをインスタンス変数にして生涯を制御してみませんか?
広告の責任を処理するクラスを作成し、それを作成してプリンシパルコンテキストを使用して使用させ、同様に特徴的にします(を使用して) パターンを処分します)。そこからインターフェイスを抽出して、それを分離し、テストが簡単に使用できるクラスを作成します。
広告サービスを使用したいクラスは、新しいインターフェイスのコンストラクターパラメーターを取得します(依存関係インジェクション またはdi)。使用するブロックで手動でクラスを作成し、クラスに渡すか、 DIコンテナフレームワーク. 。 FrameworkをADオブジェクトの寿命をコンテナの寿命に設定することができます(これも特徴的な場合があります)。見る IdisposableとIOCをどのように調整しますか? そして、これについては詳細については、DIコンテナのドキュメント。