2012-02-17 64 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,以便在其他地方不能修改它们。

至于复杂的初始化,你可以使用延迟加载(如果你让它线程安全)。有没有设置私人变量,当你'得到'一个,如果它没有初始化,初始化它。