如何在C#中为整个应用程序创建全局常量变量

时间:2014-12-28 21:26:15

标签: c# global-variables

我有一个包含系统配置的表(即system_name, system_time_zone.....

我正在尝试确定自动读取配置的最佳方法,并准备好在我的应用程序中以任何形式阅读。

基本上,我想从表中读取配置,然后将它们设置为常量变量。当应用程序加载时,我可以以任何形式重复使用它们。

我怎样才能在C#中做到这一点?

3 个答案:

答案 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;