2011-03-04 12 views
0

ユーザーがデータベースを更新するたびにシングルトンインスタンスを強制的にリセットする方法はありますか?C#でシングルトンインスタンスをリセットする方法は?

public class Example{ 
     private Dictionary<int, string> _list; 

     private Example(){ 
     _list = new Dictionary<int, string>(); 
     //Get data from database here and add the data to _list 
     } 

     private class Nested{ 
      static Nested(){} 
      internal static readonly Example Instance = new Example(); 
     } 

     public static Dictionary<int, string> GetExample(){ 
     return Nested.Instance._list 
     } 

} 

したがって、データベースが更新されたら_listをリセットしますか?

ありがとうございます!

+1

データベースが更新されたことをどのように知っていますか?ネストされたクラスの有用性は何ですか? – RQDQ

+0

キャッシュを使用し、更新時に競合状態を保護する必要があるデータのコンシューマに応じてSQL依存性の有効期限を設定します。 –

答えて

6

短い答えは:いいえ

あなたが得ることができる最も近いものを辞書リセットすることです:今

長い答えを...

なぜあなたが使用していますシングルトン? GoFのデザインパターンブックを読んで、それが楽しいアイデアのように思えたからだと思います。シングルトンパターンは、オブジェクト指向設計のすべての哲学を破ります。あなたはそれらから継承することはできません、カプセル化を破ると多型の可能性はありません。

あなたが投稿した例では、あなたのクラス(辞書)の内部の仕組みをそれを望む人に渡しています。彼らはそれを変更する場合はどうなりますか?これはスレッドでどのように機能しますか?

アプリケーションでクラスのインスタンスを1つしか必要としない場合は、newを1回呼び出すか、シングルトンライフスタイルの依存性注入コンテナを使用しますが、これは別のトピックです。

私はシングルトンが嫌いです。

+0

キャッシュのためにどのようなパターン/メカニズムを提案しますか?これは、ASP.netや他の多くのフレームワークで行われています。 – RQDQ

+0

+1最後の行だけ! (プラスそれは良い答えでした;)) – Pharabus

+0

ASP.netには、あなたのためのページ断片を格納するキャッシングが組み込まれています。レコードレベルのキャッシュやアクティブな有効期限を設定したいと思っていて、やりにくくしたいのなら、memcachedやredisのようなオプションがたくさんあります。あなたがマイクロソフトのスタックに固執する必要がある場合は、appfabric(速度)がそれを助けることができます。 – jonnii

0

これを行う1つの方法は、レイジーローディングを使用し、 "無効化"または "リセット"メソッドを提供することです。

public class Example 
{ 
    private static Dictionary<int, string> _list; 

    public static void Invalidate() 
    { 
     _list = null; 
    } 

    public static Dictionary<int, string> GetExample() 
    { 
     if (_list == null) 
      _list = new Dictionary<int, string>(); 

    return _list; 
    } 
} 

これはマルチスレッド化されていないことに注意してください。ディクショナリクラスはリエントラントコードにはお勧めできません。また、GetExampleメソッドとInvalidateメソッドで何らかのロックが必要です。

+0

これは常にnullを返しませんか? –

+0

@Joshua Evensen - そうですね。私はコードを修正した。 – RQDQ