ConnectionStrings
或<appSettings> <add key...
中存储Web.config
和其他一些设置(App.config
)。 使用工厂模式的Web应用程序 用直接注入来读取数据 提供者。
在web.config
我有钥匙
告诉我哪个DLL(提供者)
我会用来检索我的数据。
我可以拥有多个提供商 (每个DLL都是MS的提供者 SQL,MySQL或从中获取数据 一些SOA服务)。
每个DLL都有自己的名称(ID和名称空间),并且需要拥有自己的名称
配置(dataconnections,
服务网址等),第一个
想法是写在那里
app.config
。
#1 - 网站正在运行(运行时)我需要更改数据提供程序,我该怎么做?不知何故写入的默认值Web.config
将被更改。
#2 - 每个数据提供程序都有自定义配置,而App.Config文件不适用于dll程序集,只能用于可执行文件。这意味着我需要在我的Web.Config上编写(我不喜欢这个选项,因为我再次在运行时更新我的web.config)。 我该如何解决?
DLL
和DLL.config
。并且在运行时期间我可能需要更改此配置值。
答案 0 :(得分:5)
让我与您分享:
因此,我有一个Web应用程序,或一个控制台应用程序,或其他类型的应用程序,以及许多类库,我需要存储将在运行时更改的信息(每个Visual Studio项目不同)。
将此信息存储在Web.config
或App.config
内并不是一个好主意,因为它需要解决许多问题。
我认为另一种方法是每个项目都有一个XML配置文件。
每个应用程序都将读取自己的XML,并使用CacheDependency
将其添加到缓存中(更新XML配置文件时将过期)。这样我们就不需要一直读取配置,也知道配置何时更改。
IMO THIS IS THE FASTEST AND EASIEST WAY TO SOLVE THE PROBLEM
,无需使用第三方框架(也无需花时间学习/编程)。
protected void Page_Load(object sender, EventArgs e)
{
DBConfiguration cachConf;
cachConf = Cache["cachConf"] as DBConfiguration;
if (cachConf == null)
{
cachConf = new DBConfiguration();
XmlDocument doc = new XmlDocument();
doc.Load(HttpContext.Current.Request.PhysicalApplicationPath + "bin/MyConf.xml");
XmlNodeList xnl = doc.GetElementsByTagName("username");
XmlElement xe = (XmlElement)xnl[0];
cachConf.Username = xe.InnerText.ToString();
xnl = doc.GetElementsByTagName("password");
xe = (XmlElement)xnl[0];
cachConf.Password = xe.InnerText.ToString();
Cache.Insert("cachConf", cachConf,
new System.Web.Caching.CacheDependency(
HttpContext.Current.Request.PhysicalApplicationPath + "MyConf.xml"),
DateTime.Now.AddMinutes(60), TimeSpan.Zero,
System.Web.Caching.CacheItemPriority.Default,
new System.Web.Caching.CacheItemRemovedCallback(
CacheItemRemovedCallBack));
}
LabelUsername.Text = cachConf.Username;
LabelPassword.Text = cachConf.Password;
}
private void CacheItemRemovedCallBack(string key, object value, CacheItemRemovedReason reason)
{
//Response.Write("Hello world");
}
答案 1 :(得分:2)
问题1 - 运行时更改: Microsoft希望您应用于此类问题的解决方案是简单地使Web服务器保持无状态。当ASP.NET应用程序循环使用时,它允许现有请求在新进程上完成新请求。有关背景信息,请参阅IIS Process Recycling。对web.config的更改会回收工作进程,但用户不会注意到这一点(除非您在Web服务器进程中保持状态)。这就是MS的设计。
如果要在不回收进程的情况下监视更改,则需要除默认web.config行为之外的其他内容。想到的一个例子是巡航控制项目文件。它们有一个组件可以将对象映射到xml和从xml映射,使用它可以使用FileSystemWatcher类来监视更改。
问题2 - 自定义配置: 听起来你有来自不同库的组件具有不同的依赖关系。您的主程序集需要一种实例化服务的方法,具有一组给定的依赖项。 MS数据提供商模型很酷,但不是很酷。
要做到这一点,请使用控制容器的反转,因为这正是他们所做的。我喜欢autofac(因为我喜欢Philip K Dick参考),但castle windsor很棒。
现在,如果您正在谈论动态更改数据库或数据提供程序,则可能是配置不正确。如果您要针对y类型的x数据库进行报告,则需要该数据库信息的中央存储库,并且配置文件不是正确的位置,IOC容器也不是正确的解决方案。
答案 2 :(得分:2)
您可以将凭据存储在从web.config引用的辅助配置文件中,如下所示:
<appSettings file="AppSettings.config"/>
您仍需要小心避免编辑外部文件上的冲突。
答案 3 :(得分:0)