代码设计,分配静态常量

时间:2012-02-17 14:49:41

标签: c# .net

在我的应用程序中,我有一个名为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

实现这一目标的最佳设计是什么?

2 个答案:

答案 0 :(得分:3)

为什么不考虑使用具有类的用法范围的IoC容器作为Singleton()用法,或者只是对Constants类实现单例模式,而不是使用“静态”类。然后使用私有setter将类的属性设置为公共getter ...然后,您可以调用initialize()方法从数据库中提取所需的信息,但其余代码不应该影响属性的值。

e.g:

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()
    {
    }

}

答案 1 :(得分:0)

您可以将它们设置为所有属性,而不是非私有的实例变量。然后,您可以提供没有setter的getter,以便不能在其他地方修改它们。

对于复杂的初始化,您可以使用延迟加载(如果您使其线程安全)。拥有未设置的私有变量,当你得到一个私有变量时,如果它没有被初始化,则初始化它。