我有一个包含多个项目的 VS2013 解决方案。我有一个 Web API 项目、一个 MVC 项目、一个 Windows 服务项目和一些其他业务逻辑项目。 现在,如果连接字符串发生更改,我必须至少在 3 个项目中替换它。
我想要一个通用的配置解决方案。您对处理这种情况有什么建议?
我使用 App.config 文件创建了一个配置项目,但似乎 ConfigurationManager 始终使用它的应用程序配置文件,例如,如果我使用 ASP.NET 中的此配置项目,那么 web.config 就是事件配置文件,而不是类库的 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 部分组成的系列 CodeProject :
- Unraveling the Mysteries of .NET 2.0 Configuration
- Decoding the Mysteries of .NET 2.0 Configuration
- Cracking the Mysteries of .NET 2.0 Configuration
或者(甚至更简单),使用 Craig Andera 的精彩见解的一些变体:您需要的最后一个配置部分处理程序:
- https://sites.google.com/site/craigandera/craigs-stuff/clr-workings/the-last-configuration-section-handler-i-ll-ever-need
- http://haacked.com/archive/2004/06/24/verylastconfigurationsectionhandler.aspx/
- http://blogs.msdn.com/b/dotnetinterop/archive/2005/02/12/371588.aspx
- http://www.codeproject.com/Articles/7548/The-very-last-Configuration-Section-Handler-I-hope
这种方法是一个非常通用的配置节处理程序。您基本上创建一个具有强类型属性的 XML 序列化类,他的处理程序负责将配置部分反序列化到该类中。太棒了!
完成此操作后,您的自定义配置部分可以使用 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>
以防止应用程序先重新启动。
甜甜的!
关于c# - 多个项目的通用配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21715717/