多个项目的通用配置

时间:2014-02-11 23:50:05

标签: c# configuration-files

我有一个包含多个项目的VS2013解决方案。我有一个Web API项目,一个MVC项目,一个Windows服务项目,以及一些更多的业务逻辑项目。 现在,如果连接字符串发生更改,我必须至少在3个项目中替换它。

我想要一个通用的配置解决方案。你有什么建议来处理这种情况?

我使用App.config文件创建了一个Configuration项目,但似乎ConfigurationManager始终使用它的应用程序配置文件,例如,如果我在ASP.NET中使用此Config项目,那么web.config就是live config文件,而不是Class libary的app.config。

嗯,我找到了解决方案。将配置文件链接到每个项目的方法也许也不错。

最后我做了一个MyConfiguration项目。哪个只包含这一个类:

public static class MyConfiguration
{
    #if(DEBUG)
        public static string ConnectionString = "Data Source=xxxxxxxxx.database.windows.net,1433;Initial Catalog=CRM;persist security info=True;user id=xxxxxxxxxxxxxxx;password=xxxxxxxxxxxxxxx;multipleactiveresultsets=True;
    #else
    public const string ConnectionString = "Data Source=yyyyyyyyy.database.windows.net,1433;Initial Catalog=CRM;persist security info=True;user id=yyyyyyyyyyyyy;password=yyyyyyyyyy;multipleactiveresultsets=True;"
    #endif
}

我刚刚将MyConfiguration引用到我的项目中,它将为我提供调试和发布配置的正确连接字符串。 你觉得怎么样?

3 个答案:

答案 0 :(得分:2)

根据lahsrah的建议,您需要为配置文件使用“添加为链接”。但是,还有一个额外的技巧,因为您不希望在所有项目之间共享所有配置。

通过在配置部分使用configSource属性,可以将配置文件拆分为更小的文件:

  • 创建一个名为ConnectionString.config的公共配置文件。这只是connectionStrings配置部分。
  • 在每个项目中将该文件添加为链接文件(使用“添加为链接”选项)。我喜欢将它保存在名为Config的子文件夹中。
  • 使用configSource属性
  • 在主配置(App.config / Web.config)文件中使用该文件

<强> ConnectionString.config:

<connectionStrings>
<add name="CustomerCorrespondenceContext" connectionString="Data Source=(local); Initial Catalog=MyDatabase; Integrated
Security=True; MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
</connectionStrings>

<强>的Web.config:

<connectionStrings configSource="Config\ConnectionStrings.config" />

修改

根据评论,值得强调的是,这回答了如何在解决方案中使connectionStrings保持一致的问题。使用“添加为链接”选项在构建时制作配置文件的副本,因此每个项目都引用文件的本地副本,相同的文件。因此,它不能帮助控制部署环境,在这种情况下,更改一个文件会神奇地更新所有应用程序(这是一个不同的问题,具有不同的选项)。

因此,这是为了使VS解决方案可以管理任何类型的项目之间的共享配置。

答案 1 :(得分:2)

使用自定义配置部分和配置处理程序。请参阅CodeProject上的这个由3部分组成的系列文章:

或者(甚至更容易),使用Craig Andera的一些变化:你需要的最后配置部分处理程序

这种方法是一个非常通用的配置节处理程序。您基本上创建了一个具有强类型属性的XML-serialize类,并且他的处理程序负责将config部分反序列化为该类。辉煌!

完成后,您可以使用configSource属性在外部存储自定义配置部分。在您的配置文件中,您通常会执行以下操作:

<config>
  <configSections>
    <section name="myCustomSettings" type="...my-custom-type-spec..." />
  </configSections>
  ...
  <myCustomSettings>
    ...<!-- some custom xml -->
  </myCustomSettings>
  ...
<config>

你会做这样的事情告诉.Net配置系统从指定的外部文件加载该部分:

<config>
  <configSections>
    <section name="myCustomSettings" type="...my-custom-type-spec..." />
  </configSections>
  ...
  <myCustomSettings configSource="\foo\bar\baz\myCustomSettings.config.xml" />
  ...
<config>

外部文件是一个XML文档:根节点必须是部分名称,就像从配置文件中批量删除一样。:

<?xml version="1.0" encoding="UTF-8"?>
<myCustomSettings>
  ...
</myCustomSettings>

现在,您所要做的就是将所需的独立配置文件传播到不同应用程序期望找到它们的位置。

应该注意,configSource属性所在的外部文件必须是该机器的本地文件:它不能在网络上存在。

并且,在配置部分处理程序中添加一些智能,它可以连接文件系统观察程序以监视该文件以进行更改并重新加载而无需重新启动应用程序,但您需要将属性restartOnExternalChanges="false"添加到<section>以阻止应用首先重启。

甜!

答案 2 :(得分:0)

将文件“作为链接”添加到第二个项目中,您将对两个文件使用相同的文件。

如果您还需要具有项目特定设置,请创建子app.config文件并将其添加为所有项目的链接,并使所有项目app.config / web.config文件继承此链接文件。将常用设置放在链接文件中。