2011-05-06 10 views
2

シングルトンを実装するためにIOCフレームワークに頼る方が良いですか?私は、ロックを二重にチェックしたり、静的なコンストラクタに頼ったりするのは良い習慣ではないと聞きましたが、これは本当ですか?シングルトン実装の質問

+1

私は全体的に「ダブルチェックロックがうまくいかない」memeに少し疲れています。 *適切に実装されたダブルチェックロックは、.NETでうまく動作します* ...あなたが正しい方向に向いているとは限りません。私は可能な限りシングルトンを避ける傾向があります。彼らはしばしば不必要です。 –

+0

@Andrew:OPはそれがうまくいかないとは言わなかった。彼らはそれが悪い習慣であると聞きました。これは私が同意するものです。それはうまくいくのが面倒なことです、そして、ちょうどよく働く、より簡単なアプローチがほとんどあります。 (静的なコンストラクタに頼っても問題ありません。比較的小さな仕事しかしていないのであれば、あなたに気をつけてください) –

+0

@Jon Skeet - あなたは正しいです。なぜ彼は彼が言ったことではないときに私は "動作しません"と読んでいるか分からない。 –

答えて

1

私の意見では、オブジェクトのライフタイムは、オブジェクトのタイプによって強制されないようにコンテキストによって決定されるべきです。常識では、オブジェクトの「シングルトン」を保証する方法は、悪い習慣ではなく、シングルトンパターンそのものの使用法です。

質問に答えるには:はい、IoCコンテナにオブジェクトの有効期間を処理させる必要があります。

0

おそらくthis answerが役に立ちます。これは、スレッドセーフでレイジーロードされたシングルトンの基本パターンを含んでいます。

0

二重チェックロックパターンを実装するのは簡単です。それは非常に簡潔であり、良い方法です。しかし、@Andrew Barberのように、不適切に実装することは苦しいことがあります。

if(_instance == null) 
{ 
    lock(_myLockObject) 
    { 
     if(_instance == null) 
      _instance = new Something(); 
    } 
} 

return _instance; 
+1

私は '_instance'を正しいとするために' volatile 'と宣言しなければならないと思います。 –

+0

私はこれについて不思議です。 MSDNのドキュメントでは、ロックを使用していないときにvolatileを使うべきだと言います。http://msdn.microsoft.com/en-us/library/x13ttww7(v=vs.71).aspx – Tejs

+0

あなたはロックされていません。最初のチェックを実行します。メモリバリアなどはぞっとするほど複雑になる - 公開されるオブジェクト内のすべてのデータの前に参照が公開される可能性が懸念される。このようなことが私がそれを気に入らない理由です。 –

0

一般的なルールとしてのオブジェクトの有効期間は、常にIOCコンテナによって処理される必要があります。

マニュアルオブジェクトのライフタイム処理では、開発者のエラー、SRP違反、および大量のDRY違反が発生しやすくなります。

関連する問題