我通常将所有配置存储在注册表中。即使我已经开始使用LINQ,我也不希望在web.config中有DSN,而是让它留在注册表中,并将其附加到系统配置(可能在应用程序启动事件中)。
如何做到这一点?
谢谢你的任何想法!
edit:明确一点:我不想写入web.config文件,我只想在web.config之外的任何地方保留dsn(加密),所以我在所有开发阶段(本地、staginf、实时、备份)都有相同的web.config。
Christoph
VB.Net中的解决方案代码:
1) 添加一个新的类,带有一个方法,该方法继承自原始Datacontext:
Public Class MyDatabaseDataContext
Inherits DatabaseDataContext
Public Sub New()
MyBase.New(Settings.DSN)
End Sub
End Class
2) 在所有Linq数据源中使用此类,而不是在原始上下文中使用此类。
ContextTypeName="MyProject.MyDatabaseDataContext
以下是我所做的。我有一个DataContext的基类。它被称为DataContextBase,由sqlmetal.exe生成。我有一个名为DataContext的派生类,它在我的Linq调用中使用。它看起来像这样:
public class DataContext : DataContextBase
{
public DataContext()
: base(ConnectionHolder.ConnectionString)
{
}
}
我的库中有一个名为ConnectionHolder的静态类,它存储连接字符串:
public static class ConnectionHolder
{
static string _ConnectionString;
public static string ConnectionString
{
get { return _ConnectionString; }
set { _ConnectionString = value; }
}
}
(注意:这与DataContext是分开的,因为在Linq之外的应用程序中有一些地方我使用连接字符串)。在应用程序启动时,我说ConnectionHolder.ConnectionString=(存储连接字符串的位置)。
为什么不在web.config中对其进行加密?如果您不想使用aspreg_iis
,那么只加密Application_Start
上web.config中的连接字符串是相当容易的。之后,您甚至可以使用IIS管理工具编辑加密的web.config。
Configuration config = WebConfigurationManager.OpenWebConfiguration(
HttpContext.Current.Request.ApplicationPath );
ConfigurationSection section = config.Sections["connectionStrings"];
if (!section.SectionInformation.IsProtected
&& !GlobalConfiguration.ApplicationVersion.EndsWith( "dev" )) // don't encrypt dev
{
section.SectionInformation.ProtectSection( "DataProtectionConfigurationProvider" );
config.Save();
}
如果必须将其存储在注册表中。您可以始终在DataContext上使用构造函数,该构造函数接受连接字符串并传入从注册表中读取的值。假设您将其存储在应用程序存储中,因此您只需从注册表中读取一次。
Scott Guthrie有一个很好的参考页面来加密您的网络配置,尽管大多数示例都使用aspreg_iis
。我更喜欢在Application_Start
上做,这样我就不会忘记在意外情况下加密它。
在使用遗留代码时,这是一个相当合理的要求。
DataContext类是一个分部类,所以我只添加了一个静态工厂方法,该方法加载配置设置并创建数据上下文结果。