我正在研究如何使我们的应用程序更易于扩展和更容易操作,而无需更改web.config(或者,在我们的示例中,包含appsettings节点的application.config文件)。
我想到的一种方法是将应用程序设置保留在具有sqlcachedependancy的数据库表中。这意味着:
我认为这可能会导致严重的逻辑问题,如果你有一些东西可以在流程开始时检查一个appsetting,然后它会在中途发生变化,你最终会无意中改变流程flow,因为取消了完整应用程序重启的要求。
有没有办法解决这个问题?
是否有更好的方法来管理appsettings,以便您可以一次性为一台,多台或所有服务器远程更改它们?
答案 0 :(得分:4)
我认为你已经确定了两个主要参与者:
OR:
这两种方法各有利弊。我一直在努力寻找一种从数据库字段“实现”配置部分的方法,这样我基本上只需使用配置XML,但存储在数据库字段中。不幸的是,整个.NET 2.0配置系统被“锁定”并且只假设数据来自文件 - 没有办法插入,例如一个数据库提供程序,允许配置系统从数据库字段中读取其内容:-(真的太糟糕了!
我见过的唯一另一种方法是微软提供的StockTrader 2.0 sample app中的“ConfigurationService”,但是对于我的需求,它感觉像是一种过度的,就像一个非常复杂,非常重的子系统。
答案 1 :(得分:2)
如果您引用包含appsettings的外部配置文件(将所有其他内容保留在正常的app.config中),那么我相信编辑它只会重新加载这些设置,它不会强制整个应用程序重新启动。
这里有一个类似的问题: Nested app.config (web.config) files
WRT在程序执行过程中值的变化问题,我猜你可以在本地缓存这些值,并在它们发生变化时引发一个事件,允许例程在使用更新的值之前到达一个合适的点。
我认为在asp.net中我们可以免费获得这个,因为每个页面的生命周期都是不同的,所以这个值只是应用于新的页面请求,而不是在执行过程中。
编辑:一点额外信息:
配置更改导致重新启动应用程序域
来自MSDN:
对Web.config文件中的配置设置的更改会间接导致应用程序域重新启动。此行为是通过设计发生的。您可以选择使用configSource属性来引用在进行更改时不会导致重新启动的外部配置文件。有关更多信息,请参阅由Section Elements继承的General Attributes中的configSource。
有关ConfigurationManager class中System.Configuration namespace的更多信息,可用于以编程方式修改配置文件(例如,在自定义工具中,如果可以提供相关的磁盘读取权限)。如果您坚持使用内置配置类,我认为更改外部配置不会导致应用程序重新启动,但会引发您可以处理的事件(例如property changed),以确保您的代码不会被捕获通过更改设置。
答案 2 :(得分:2)
你可以使用SQLite,它将是一个单独文件中的自包含数据库。一石二鸟?