在我的应用程序中,我有一个名为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 :(得分: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,以便不能在其他地方修改它们。
对于复杂的初始化,您可以使用延迟加载(如果您使其线程安全)。拥有未设置的私有变量,当你得到一个私有变量时,如果它没有被初始化,则初始化它。