2012-02-17 24 views
0

私のアプリでは、私のプロジェクト全体にアクセスするすべてのグローバル値を保持するConstantsという静的クラスがあります。 Constantsのセクションは、そうのように見える:コードデザイン、静的定数の割り当て

internal static class Constants 
    { 
     internal static DateTime FromDate = new DateTime(2011, 10, 1); 
     internal static DateTime ToDate = new DateTime(2011, 10, 31); 
     internal static decimal TaxRate = 20m; 
    } 

しかし今TaxRateは、データベースから動的にアクセスする(そしてその後、リポジトリのインスタンスを介して利用可能です)。しかし、静的コンストラクタはパラメータを持つことができないので、これをどのように達成できますか?

私はそれを維持するConstantsが欲しいのですが、同じ性質です:

  • それは、したがって、インスタンス化できない静的だと持って異なるバージョンを
  • それは性質が
(理由 const改質剤)を変更することはできませんです
  • しかし、TaxRateを参照オブジェクトから初めて設定することもできます。

    これを達成するにはどのようなデザインが最適でしょうか?

  • +0

    http://stackoverflow.com/questions/2687403/c-sharp-static-constructors-design-problem-need-to-specify-parameter参照オブジェクトはどのようなタイプですか?それはdbmsまたは設定ファイルに格納することはできますか? –

    +0

    まず、私の心に来るのは、このようなものです。内部静的小数TaxRate {get;プライベートセット} ..あなたは値を取得できますが、設定することはできません。アプリケーションの起動時に、反映を介してTaxRateを設定することができます。 –

    +0

    これはリポジトリオブジェクトですが、特別なものはありません。 –

    答えて

    3

    このために「静的」クラスを使用する代わりに、クラスの用途のスコープを持つIoCコンテナをSingleton()の使用法として使用するか、単純にConstantsクラスに対してシングルトンパターンを実装し、クラスのプロパティをプライベートsetterでパブリックゲッターに設定します。次に、initialize()メソッドを呼び出して必要な情報をデータベースから取得できますが、残りのコードはプロパティの値に影響します。

    例えば:

    public class Constants 
    { 
        static Constants instance; 
        public static Constants Instance 
        { 
         get 
         { 
          if (instance == null) 
          { 
           instance = new Constants(); 
           instance.Initialize(); 
          } 
         } 
        } 
    
        public void Initialize() 
        { 
         // db logic here to populate db recorded fields. 
        } 
    
        private Constants() 
        { 
        } 
    
    } 
    
    +0

    私はそれについて考えた後で私が興味を持っているのは唯一のことです...公共のゲッタが読み込み専用でない限り、あなたはまだ日付の値を変更できるかもしれませんが、私が静的なクラスと呼ぶならば、私はそれらの値を変更しようとはしないでしょう...それがどれほど守備的であるかは分かりません。 –

    0

    あなたはそれらすべてのプロパティではなく、プライベートではないインスタンス変数作ることができます。他の場所で変更することができないように、セッターなしでゲッターを提供することができます。

    複雑な初期化では、遅延ロードを使用できます(スレッドを安全にする場合)。プライベート変数が設定されていない場合は、それが初期化されていない場合は初期化します。