静态对象|自定义ConfigurationManager for Environment Independent Web.config

时间:2011-09-30 18:58:04

标签: asp.net static configurationmanager namevaluecollection

我正在开发一个典型的.net网络应用程序,该应用程序首先部署在测试环境中 - ENV-T 然后在完成测试后将其移至Production ENV - P. 我们的托管服务提供商不会直接在Prod上部署任何内容,而是首先部署在Test上,然后将它们同步到PROD。

这两个环境Env-T和Env-P完全不同。所以Web.Config设置也不同。

因此,要在ENV-P上部署任何内容,我们必须根据Env-P更改ENV-T的web.config。然后要求托管供应商同步应用程序,然后我们必须还原。

为了解决这个问题,我想到让Web.config环境独立。所以我编写了一个自定义的ConfiguraitonManager类,它将识别应用程序正在其中工作的当前环境,并相应地加载值。

高级方法:我们将在ENV-T文件夹中有两个Web.config,在ENV-P文件夹中有另一个。根据机器名称,我们将识别环境。如果是ENV-T,则从ENV-T文件夹加载Web.Config值,如果是ENV-P,则加载ENV-P文件夹中的值。

这是我的班级:

public static class ConfigurationManager
{
    static Configuration _config;
    static NameValueCollection nameValueColl;
    public static NameValueCollection AppSettings
    {
        get
        {

if (nameValueColl == null)
            {
                if (_config == null)
                    _config = LoadConfig();
                nameValueColl = new NameValueCollection();
                foreach (KeyValueConfigurationElement configElement in _config.AppSettings.Settings)
                {
                    nameValueColl.Add(configElement.Key, configElement.Value);

                }

            }
            return nameValueColl;
        }
    }

    private static Configuration LoadConfig()
    {
        string basePath = string.Empty;


        if (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath != null)
        {
            basePath = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;
        }

        string machineName = System.Environment.MachineName;

        if (machineName.Equals("MachineA"))
        {
            _config = WebConfigurationManager.OpenWebConfiguration(basePath + "Test");
        }
        else if (machineName.ToLower().Equals("MachineB"))
        {
            _config = WebConfigurationManager.OpenWebConfiguration(basePath + "Prod");
        }


        return _config;
    }

}

现在我所要做的就是写

ConfigurationManager.AppSettings["KEY1"]

读取Appsetting键“KEY1”,我得到该特定环境的正确值。

问题: 我有钥匙 <add key="NoOfRecords" value="50"/>

出于某种原因,经过几次点击(一天或两天)后,我获得的NoOfRecords键值为50,50,50,50,50而不是50。 可能的原因: 如果我添加一个键,值为“NoOfRecords”,“50”,表示已经有“NoOfRecords”,“50”的NameValueCollection对象,它将值存储为 “NoOfRecords”, “50,50”。

但是再次如何这可能导致在此代码块之前我正在创建一个新对象,并且我对此nameValueColl变量进行了空检查。

0 个答案:

没有答案