我通常将所有配置存储在注册表中。 即使我已经开始使用LINQ,我也不想在web.config中使用DSN,而是让它保留在注册表中并将其附加(可能在应用程序启动事件中)到系统配置。
如何做到这一点?
Thanx任何想法!
编辑:说清楚:我不想写入web.config文件,我只想将dsn(加密)保存在web.config以外的任何地方,所以我有相同的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
答案 0 :(得分:1)
为什么不在web.config中加密?如果您不想使用Application_Start
,在aspreg_iis
上加密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有一个很好的references页面用于加密您的网络配置,但大部分示例都使用aspreg_iis
。我更喜欢在Application_Start
上这样做,所以我不会忘记在意外加密它。
答案 1 :(得分:1)
这就是我的工作。我的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之外的地方我使用连接字符串)。在app启动时,我说ConnectionHolder.ConnectionString =(无论你存储连接字符串的哪个地方)。
答案 2 :(得分:0)
使用遗留代码时,这是一个相当合理的要求。
DataContext类是一个部分类,所以我只添加一个静态工厂方法来加载配置设置并创建datacontext结果。