我们运行一个用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中是否有建议的行业标准方法来解决这个问题?
答案 0 :(得分:2)
如果这都属于同一家公司,为什么不将配置存储在数据库中呢?我相信企业框架甚至还有可以插入的适配器来做这件事。
我知道在我们公司,因为我们在webfarms中运行了站点,我们将配置存储在db中,然后如果我们需要更改某些内容,我们将使用db脚本更新配置。无需推送到网站,只需重新启动网站或触摸web.config强制重新加载。
我们对其他项目的另一个解决方案是使用一个数据库,该数据库包含键值对以及其他类型的配置数据,这样我们也可以轻松地更改使用相同组件的网站/窗体表单项目。
所以我想我所说的是,如果他们都在同一公司/影响范围内,那么你可以使用一个对他们来说都很重要的数据库,只需使用数据库。
不要对注册表进行审核。
答案 1 :(得分:0)
我会使用OpenExeConfiguration(http://msdn.microsoft.com/en-us/library/ms224437.aspx)并让每个app / dll打开2个配置,第一个是默认值,第二个是覆盖。
您可以将默认设置保留在“中央”位置,授予对其所有应用的读取权限,并让本地配置位于您的应用附近。
答案 2 :(得分:0)
如何部署这些网站和应用程序,系统中的这些模块是否在同一台机器上运行,这些模块是否从特定目录调用DLL?
如果在同一台机器上你可以使用配置文件,如果在服务器场中,你可能需要像Joshua之前提到过的数据库。
如果您只需要将某些配置部分覆盖到通用配置文件,则可以先从中心位置加载默认值,然后在每个项目中加载特定配置,然后在运行时修改配置对象。