4

我正在寻找使我们的应用程序更具可扩展性和更易于操作的方法,而无需更改 web.config(或者,在我们的例子中,application.config 文件,其中包含 appsettings 节点)。

我考虑过的一种方法是将应用程序设置保留在具有 sqlcachedependancy 的数据库表中。这意味着:

  • 每当数据库中的设置发生更改时,缓存就会失效,并且会再次检索设置,从而实时更新应用程序,而无需更改文件并重新启动整个应用程序。
  • 我们可以创建一个允许我们更改设置的自定义工具。

我看到的缺点是,这可能会导致严重的逻辑问题,如果您在流程开始时检查应用程序设置,然后在中途更改,您最终可能会无意中改变流程,如完全重新启动应用程序的要求被否定。

有办法解决这个问题吗?

有没有更好的方法来管理应用程序设置,以便您可以一次远程为一台、多台或所有服务器远程更改它们?

4

3 回答 3

4

我认为您已经确定了两个主要参与者:

  • 要么您可以访问文件系统,然后将所有设置放在大量的 *.config 文件中

或者:

  • 您无权访问(或只有非常有限的访问权限)服务器的文件系统,因此您最好将配置设置和用户首选项放在数据库中,基本上只留下磁盘上配置文件的连接字符串

两种方法都有其优点和缺点。很长一段时间以来,我一直在尝试找到一种从数据库字段“实现”配置部分的方法,这样我基本上可以只使用配置 XML,但存储在数据库字段中。不幸的是,整个 .NET 2.0 配置系统非常“锁定”,只是假设数据将来自文件 - 无法插入例如数据库提供程序以允许配置系统从数据库字段读取其内容: ——(真的太惨了!

我见过的唯一其他方法是 Microsoft 提供的StockTrader 2.0 示例应用程序中的“ConfigurationService” ,但就我的需要而言,它感觉有点矫枉过正,而且是一个非常复杂、非常重量级的子系统。

于 2009-09-11T11:21:54.853 回答
2

如果您引用包含 appsettings 的外部配置文件(将其他所有内容保留在普通 app.config 中),那么我相信编辑它只会重新加载这些设置,它不会强制整个应用程序重新启动。

这里有一个关于这个主题的类似问题: Nested app.config (web.config) files

WRT 在程序执行过程中值改变的问题,我猜你可以在本地缓存这些值,并在它们改变时引发一个事件,让例程在使用更新的值之前达到一个合适的点。

我认为在 asp.net 中我们可以免费获得它,因为每个页面生命周期都是不同的,因此该值仅应用于新页面请求,而不是在执行过程中。

编辑:一些额外的信息:

配置更改导致应用程序域重新启动

来自MSDN

Web.config 文件中配置设置的更改间接导致应用程序域重新启动。此行为是设计使然。您可以选择使用 configSource 属性来引用在进行更改时不会导致重新启动的外部配置文件。有关详细信息,请参阅节元素继承的常规属性中的 configSource。

有关System.Configuration 命名空间中的ConfigurationManager 类的更多信息,可用于以编程方式修改配置文件(即在自定义工具中,如果可以提供相关的磁盘读取权限)。如果您坚持使用内置的配置类,我认为更改外部配置不会导致应用程序重新启动,但会引发您可以处理的事件(例如property changed),以确保您的代码不会被更改设置捕获.

于 2009-09-11T11:22:57.957 回答
2

可以使用 SQLite,它将是单个文件中的自包含数据库。一石两鸟?

于 2009-09-11T11:27:47.807 回答