我有一个包含系统配置的表(即system_name, system_time_zone.....
)
我正在尝试确定自动读取配置的最佳方法,并准备好在我的应用程序中以任何形式阅读。
基本上,我想从表中读取配置,然后将它们设置为常量变量。当应用程序加载时,我可以以任何形式重复使用它们。
我怎样才能在C#中做到这一点?
答案 0 :(得分:6)
好吧,你可以创建一个singleton class,它会在启动时读取配置。
但就个人而言,我会调查dependency injection。在.NET中有很多的DI框架,这样你就可以拥有更容易测试的代码,因为它给出配置而不是获取它来自某个可能丑陋到虚假的地方。
您可能还需要考虑将配置分离到不同的相关部分,并且只将与类相关的配置部分注入该类。例如,您可能希望一个类包含所有与数据库相关的设置,另一个类用于所有与电子邮件相关的设置(如果需要发送或检索电子邮件)等。这样就可以明确配置哪些方面的每个部分您的系统依赖于,这提高了可维护性。
答案 1 :(得分:4)
您可以实现 Singleton Pattern ,如下所示:
public class AppConfiguration
{
private static readonly Lazy<AppConfiguration> Instance
= new Lazy<AppConfiguration>(LoadConfiguration, LazyThreadSafetyMode.PublicationOnly);
public static AppConfiguration Current
{
get { return Instance.Value; }
}
public string SystemName { get; private set; }
public int SystemTimeZone { get; private set; }
private AppConfiguration() {}
private static AppConfiguration LoadConfiguration()
{
var configuration = new AppConfiguration();
configuration.LoadFromDatabase();
return configuration;
}
private void LoadFromDatabase()
{
using (var db = new AppEntities())
{
// Load configuration from DB
this.SystemName = ""; // Load properties
}
}
}
你可以像这样使用它:
var systemName = AppConfiguration.Current.SystemName;
答案 2 :(得分:1)
你可以为它创建一个Singleton类:
public class ConfigurationSettings
{
private ConfigurationSettings _instance;
public int Setting1 { get; set; }
public static ConfigurationSettings GetInstance()
{
return _instance;
}
// call this method once to load up all the data (at startup)
public static void InitializeSingleInstance()
{
_instance = new ConfigurationSettings();
}
private ConfigurationSettings()
{
// load from db / files / ...
}
}
获取设置将如下:
int setting = ConfigurationSettings.GetInstance().Setting1;