2012-02-17 66 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或配置文件中嗎? – 2012-02-17 14:56:38

+0

我想到的第一件事就是這樣..內部靜態十進制TaxRate {get;私人設置} ..所以你可以得到的價值,但沒有設置。當應用程序啓動時,您可以通過反射設置TaxRate。 – 2012-02-17 14:59:05

+0

這是一個存儲庫對象,沒什麼特別的。 – 2012-02-17 14:59:36

回答

3

爲了不使用「靜態」類,爲什麼不考慮使用IoC容器,該類的用法範圍是Singleton()用法,或者只是對Constants類實現單例模式,然後將該類的屬性設置爲使用私有setter的公共getter ...然後可以調用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

在我想到這件事之後,唯一讓我好奇的事情是......除非公衆「getters」是隻讀的,否則您仍然可以更改日期的值,但我總是有這樣的規則:如果我將它稱爲靜態類,那我不會試圖改變這些值......只是不確定它是否具有防禦性。 – 2012-02-17 19:24:06

0

你可以讓他們不屬於私人所有的屬性,而不是實例變量。然後,您可以提供沒有setter的getter,以便在其他地方不能修改它們。

至於複雜的初始化,你可以使用延遲加載(如果你讓它線程安全)。有沒有設置私人變量,當你'得到'一個,如果它沒有初始化,初始化它。