处理多个配置文件实例的最佳方法是什么?

9
我们运行一套由C#.NET 3.5编写的复杂系统,其中包括20多个网站、10多个Windows服务和各种定时任务和辅助应用程序。
每个组件都捆绑了一个或多个我们的框架和业务逻辑DLL。这些DLL具有广泛的配置设置,导致我们为同一类库的多个实例维护超过40个配置文件,这变成了噩梦。
由于以下原因,我们不在GAC中注册DLL: 1)我们喜欢灵活性,可以快速推出有选择性的项目更改,而无需重新构建整个系统或造成不必要的停机时间。 2)某些DLL的实例需要略有不同的配置;例如,某些项目使用不同的连接字符串、通知电子邮件地址等。
我们尝试使用Web.config/App.config中的AppSettings文件/configSource属性,但这些属性仅适用于相对路径,而不能跨项目使用。我们考虑将默认值保存在machine.config中,但这会使其变得混乱,并且包含与我们项目无关的重要内容。
我们目前的“解决方案”是使用自己的配置文件格式,首先检查当前项目的bin文件夹中是否存在配置文件,如果不存在,则从硬编码的中央位置加载。这样就可以在必要时覆盖设置,但其他时间可以使用默认设置。
最终,我们希望在中央位置拥有每个类库的默认设置,然后每个实例都可以具有可选配置文件,该文件仅覆盖与默认设置不同的设置。
是否有.NET行业标准的建议解决这个问题的方法?

3
我对这种事情毫无专业知识,但是这不是注册表的作用吗?我确信它有自己的问题,但想知道是否应该将其视为解决方案? - Tom Duckering
所有这些都在同一台服务器上运行吗? - Amirshk
这个问题在stackoverflow上有一个类似的帖子:https://dev59.com/uUvSa4cB1Zd3GeqPbRP5#2024921,我在那里写了一个我编写的工具,也许对你有帮助。仅供参考。 - Noon Silk
是的,它们运行在同一(独立)服务器上。 - realworldcoder
3个回答

2
如果这些都在同一家公司内部,为什么不将配置存储在数据库中呢?我相信企业框架甚至有适配器可以插入到这个过程中。我们公司的做法是,由于网站运行在WebFarm中,我们会将配置存储在数据库中,然后如果需要更改某些内容,我们会有一个数据库脚本来更新配置。无需推送到网站,只需重新启动站点或触摸web.config以强制重新加载即可。对于其他项目,我们使用了一个包含键值对和其他类型配置数据的数据库,以便我们还可以轻松地跨我们的网站/Windows表单项目更改使用相同组件的东西。所以我想说的是,如果它们都在同一家公司/影响范围内,以便您可以使用一个对它们所有人都有用的中央数据库,请使用数据库。不要污染注册表。

+1 - 我刚写完我们公司正是这样做的,当 Joshua 发布他的答案时。配置被存储为序列化类,并可以以各种方式存储(工作站+应用程序、应用程序全局等)。 - TrueWill

0

我会使用OpenExeConfiguration (http://msdn.microsoft.com/en-us/library/ms224437.aspx) 并让每个应用程序/动态链接库打开2个配置文件,第一个是默认值,第二个是覆盖。

您可以将默认值保存在“中央”位置,授予所有应用程序对其的读取权限,并使本地配置文件位于应用程序附近。


0
你是如何部署这些网站和应用程序的?这些模块是否在同一台机器上运行?这些模块是否从特定目录调用DLL?
如果在同一台机器上,你可以使用配置文件。如果在服务器群中,你可能需要像Joshua之前提到的那样使用数据库。
如果你只需要覆盖一些配置部分到一个公共的配置文件中,你可以先从中央位置加载默认值,然后在每个项目中加载特定的配置,然后在运行时修改Configuration对象。

这些网站/应用程序通过sftp部署到同一服务器上的每个项目的单独文件夹中。我们很快将负载均衡到第二个完全相同的服务器,并拥有所有应用程序和配置的副本。当我考虑服务器群时,为此设计一个简单的键/值数据库听起来非常不错。 - realworldcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接