6

SOLID およびその他のベスト プラクティスに従って、Active Directory ラッパーを作成しています。インターフェイスは現在「IActiveDirectory」です。

私が今抱えている問題は、実装 ActiveDirectory が IDisposable を実装して、このラッパー内で作成および破棄されるいくつかのリソースを破棄する必要があることです。インターフェイスなどにコーディングしようとしているときに、この問題に対処する方法がわかりません.漏れやすい抽象化 (つまり、IDisposable を使用して IActiveDirectory をデコレートする) を作成したくありません。基礎となる依存関係のパフォーマンスが原因で、サービスを細かくすることはできません (つまり、リソースの作成/破棄をメソッド呼び出しにスコープする)。

私は現在、IActiveDirectory のコンシューマーがオンデマンドで 1 つを作成できるようにファクトリーを持っていますが、コンシューマーがリソースの処理が完了したことを通知するためのクリーンで便利な方法が必要です。

リソース ラッパーの抽象化を漏らさずにコントラクト (つまりインターフェイス) を消費者に提供するにはどうすればよいですか? インターフェイスなしで実装を公開するだけですか?コンシューマーまたは DI コンテナーがこのサービスの有効期間を管理する方法はありますか?

4

1 に答える 1

0

一方では、リソースを処分する責任は、それを取得した人にあります。クライアントが ActiveDirectory を作成するのではなく、ファクトリが作成するため、概念的には、ファクトリは ActiveDirectory を破棄する必要があります。

難しいですが、達成可能です。1 つの例は、ファクトリ スコープをリクエストのスコープに制限し、リクエストが完了したときに Active Directory で安全に破棄できる Web アプリケーションです。もう 1 つの例は、IDisposable を処理する方法を知っている IoC コンテナーによってインスタンスが管理されている場合です (NInject には、これを行うためのトリッキーなハックがあります)。

次に、それが当てはまらない場合は、一般的なソリューションが最もパフォーマンスの高いものではないことを認める必要があります (これはまったく驚くべきことではありません)。それでも抽象的になりたい場合は、通信を明示的に表す追加の抽象化 IActiveDirectorySession を作成できます。 AD とのセッションであり、少なくとも非常に自然な理由で IDisposable を実装する必要がありました。

于 2013-11-01T21:22:29.817 に答える