最近,我已经工作的方法来解决配置问题,在大型,多环境解决方案。在开始的时候,我只是想以{A1})为他们的工作与我们的新设置。并非所有的第三方工具将很容易解决。其次,该项目的所有开发工作必须训练有素,使用新技术,并永远记住使用Core.Configuration.AppSettings ["; keyquot; ConfigurationManager中,而不是因为ConfigurationManager.AppSettings ["keyquot;可以为null或持有错误的值。
考虑到这一点,下一个逻辑步骤是找到一种方法来覆盖确保Core.Configuration设置完全集成ConfigurationManager中内置。总之:ConfigurationManager.AppSettings或ConfigurationManager.ConnectionStrings的任何调用应该返回正确的设置,该设置是否从本地Web / app.config或Core.Config。为了做到这一点,这是假设,如果设置出现在本地的应用程序/ web.config和Core.Config文件,然后在Core.Config文件中的值将返回的值。
Williablog.Core项目的最新版本:{A2}。
添加一个从您的项目中对它的引用(项目或bin文件夹中的DLL),并在void main的第一行(控制台应用程序或全局(如果Web应用程序)的Application_Start())。 asax应该是:Williablog.Core.Configuration.ConfigSystem.Install();
这将重新初始化配置,迫使它重建值的静态缓存,但这个时候,我们在控制,因此,我们能够有效地覆盖ConfigurationManager中。以下是代码:{C}
的代码,实际上我们的馆藏合并是为扩展方法实现:namespace Williablog.Core.Extensions
{
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
public static class IEnumerableExtensions
{
/// <summary>
/// Merges two NameValueCollections.
/// </summary>
/// <param name="first"></param>
/// <param name="second"></param>
/// <remarks>Used by <see cref="
/// Williablog.Core.Configuration.ConfigSystem">ConfigSystem</c>
/// to merge AppSettings</remarks>
public static NameValueCollection Merge
(this NameValueCollection first, NameValueCollection second)
{
if (second == null)
{
return first;
}
foreach (string item in second)
{
if (first.AllKeys.Contains(item))
{
// if first already contains this item,
// update it to the value of second
first[item] = second[item];
}
else
{
// otherwise add it
first.Add(item, second[item]);
}
}
return first;
}
/// <summary>
/// Merges two ConnectionStringSettingsCollections.
/// </summary>
/// <param name="first"></param>
/// <param name="second"></param>
/// <remarks>Used by <see cref="Williablog.Core.Configuration.ConfigSystem
/// ">ConfigSystem</c> to merge ConnectionStrings</remarks>
public static ConnectionStringSettingsCollection Merge
(this ConnectionStringSettingsCollection first,
ConnectionStringSettingsCollection second)
{
if (second == null)
{
return first;
}
foreach (ConnectionStringSettings item in second)
{
ConnectionStringSettings itemInSecond = item;
ConnectionStringSettings existingItem =
first.Cast<ConnectionStringSettings>().FirstOrDefault
(x => x.Name == itemInSecond.Name);
if (existingItem != null)
{
first.Remove(item);
}
first.Add(item);
}
return first;
}
}
}
如果我们创建一个控制台应用程序进行测试,完成与自己的app.config文件看起来像这样:<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="WebServiceUrl" value="http://webservices.yourserver.com/YourService.asmx"/>
<add key="SmtpServer" value="smtp.yourmailserver.com"/>
<add key="LocalOnly" value="This is from the local app.config"/>
</appSettings>
<connectionStrings>
<add name="AppData" connectionString="data source=Audi01;
initial catalog=MyDB;User ID=User;Password=Password;"
providerName="System.Data.SqlClient"/>
<add name="ElmahDB" connectionString="Database=ELMAH;
Server=Audi02;User=User;Pwd=Password;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
并运行下面的代码:
输出为:smtp.yourlocalmailserver.com
This is from the local app.config
data source=Ford01;initial catalog=MyDB;User ID=User;Password=Password;
除了中间的一个(LocalOnly),所有这些设置Williablog.Core.Config,而不是当地的app.config证明,配置文件成功合并。
ConfigSystem类可以修改,从注册表中获取额外的appSettings,从数据库或从任何其他来源,你小心使用。
我要感谢下面的文章,我发现非常有用的contributers /作者:{A3}{A4}