フライ級工場の問題IDisposable
-
22-09-2019 - |
質問
いう精神にこだわった、フライ級のパターン問題ですから。
第一に、ということかも使い捨てタイプ DisposableFiddle
ならびに工場を建設 FiddleFactory
:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
そして、私の考えでは、この目にも明らかをクライアント FiddleFactory
この工場権)について所有権の怒ることで、お客様の責任で処理を怒が行われます。
しかし、そうではなく言えられたらと思っていますfiddlesト間のフライ級のパターン:
public class FiddleFactory
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding s is found.
}
}
そして感じる道徳的義務の工場そのものを使い捨てからのfiddles持参照の中のすべてます。が引き起こす問題を、お客様のことを想定して保有のfiddlesべて処分します。
の問題を実際にその工場 FiddleFactory
の代わりに、 FiddlePool
, の作成方法 CreateFiddle
の代わりに GetFiddle
?このように:
public class FiddlePool : IDisposable
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle GetFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding s is found.
}
// Implements IDisposable
}
いよいよ、クライアントができならきっと合わせて返され怒ではプールの責務の処分を行fiddles.
ですがこの限り容易に解決ュ賢?
はしてもらえると助かりますのジレンマ?はなんてあります。:-)
解決
私は二つの方法の問題:
ThreadPool-スタイル:リデザインの授業では、
FiddlePool
インターフェースを提供いヒいます。プールのない方Fiddle
インスタンスでFiddlePool.PlayFiddle
方法です。プール制御怒寿命、責任者を処理します。SqlConnection-スタイル:修正
Fiddle
's"公開処分の方法なんかを返しますfiddlesの怒プールの怒クラスのカプセル化).内部的には、怒プールの 本当に 公使い捨てます。
他のヒント
私はあなたの第二の意見に同意します。用語「プール」とは、消費者へのメイク物事をより明確に行う "を取得します]。しかし、それはまだ十分なものを明確にしないと、ドキュメントは常にフル、有効な理解を確実にするために追加する必要があります。
あなただけのドキュメントや処分呼び出さないクライアントに指示する方法を命名以上の何かを行う必要があります。本当にクライアントが使用パターンことを確認ようにdisposeを呼び出す持っている方が良いだろう。当社のデータベース接続プールが構築されてから、いくつかの方向を取ります。
データベース・プール自体がプール-認識している接続の束。電話番号は、それを開いて、接続を作成し、それに近い(処分)を呼び出します。呼び出し元のコードは、それがプールされたかどうさえ本当に分かっていないか、それはすべての接続クラスによって内部的に処理いません。プールされた接続では、()のオープンを呼び出して、接続がすでに開いている場合は無視されます。クローズ()/廃棄()が呼び出され、プールされた接続の場合、これは実際にそれを閉じるのではなく、プールに接続バックを返します。
あなたは処分を無効にして、プールにオブジェクトを返しますPooledFiddleクラスを作成することによって、同じことを行うことができます。理想的にはクライアントもそれをプールフィドルことを知っている必要はありません。