返回首页


最近,我已经工作的方法来解决配置问题,在大型,多环境解决方案。在开始的时候,我只是想以{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}

回答

评论会员:dascalos 时间:2012/01/26
这个职位,得到我的方式有最。我想使用在Web应用程序,在那里我可以为英寸注入我自己的applicationName价值...


<system.web>

<membership>

<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" applicationName="/" />

</membership>

</system.web>


跟踪调用到GetSection,应用程序从不要求"的system.web"configKey。

任何指导,将大加赞赏
评论会员:。Williarob 时间:2012/01/26
如果你的子类SqlMembership提供商和覆写Initialize方法,您可以拦截所有的值,并改变它们之前将它们传递到基类:


见:
{A5}更多信息
评论会员:。dascalos 时间:2012/01/26
谢谢。这不正是我需要做的。我在错误的道路
评论会员:游客 时间:2012/01/26
。ashutosh3007率领下来
我怎样才能从web.config文件的不同部分价值。 IM真正的web.config文件和你的(自定义)willablog.core.config文件相混淆。当我想从web.config文件中的关键的值时系统的值将返回我。

E.X
真正的web.config文件LT; appsettingsgt;
LT添加键="payPalKey"价值="123456789"GT
LT / appsettingsgt;
现在

willablog.core.config文件
LT; appsettingsgt;
LT添加键="payPalKey"价值="123456"GT
LT / appsettingsgt;

在cs文件
回复于(configuratinmanager.appsettings"payPalKey"]的ToString())

并如果web.config和willablog.core.config合并比我怎样才能获得sectionGroup中?
将输出什么?123456789或123456 修订于8月6日(星期五),2010 6:44 AM
评论会员:Williarob 时间:2012/01/26
我写的方式,如果在本地配置文件和core.config文件是相同的appsetting,williablog.core.config设置将返回的值(所以在你的上面的例子,回复于(configuratinmanager.appsettings"payPalKey"]的ToString())将​​打印123456
评论会员:。lbogni 时间:2012/01/26
您好,
我试试你的代码,它是非常好的!!切勿seee!
你有一个重置WCF配置缓存的提示??

这种东西是什么:
LT;?XML版本="1.0"编码="UTF - 8"GT;
LT; configurationgt;
LT; System.Windows.Forms的jitDebugging ="TRUE"/ GT;
LT; runtimegt;
LT; generatePublisherEvidence启用="假"/ GT;
LT; assemblyBinding的xmlns ="金塔:架构微软COM:asm.v1"GT;
LT;探测的PrivatePath ="组件"/ GT;