使用web.config存储设置的替代方法(适用于复杂的解决方案)

时间:2008-11-20 17:39:23

标签: asp.net web-config configuration-files

在我们的网络应用程序中,我们将数据访问层分隔到他们自己的项目中。

这会产生一些与设置相关的问题。

因为DAL最终需要从多个应用程序中使用,所以web.config似乎不是保存连接字符串和其他一些与DAL相关的设置的好地方。

为了解决这个问题,在我们最近的一些项目中,我们引入了第三个仅用于设置的项目。我们将设置放在.Setting文件系统中......使用简单的包装器,可以轻松实现各种环境(Dev,QA,Staging,Production等)的不同设置。

唯一的问题是设置项目(包括.Settings类)编译成一个程序集,所以你不能在不进行构建/部署的情况下进行更改,我们的一些客户希望能够配置他们的没有Visual Studio的项目。

那么,这是最好的做法吗?我有这种感觉,我正在重新发明轮子。

我们遇到了一些解决方案,例如将设置存储在服务器上的固定目录中,例如我们自己的XML格式。但同样,我宁愿避免为敏感值重新创建加密等等。如果可能的话,我宁愿保持解决方案的独立性。

编辑:最初的问题并没有包含我们不能(我认为)使用web.config的真正具有穿透力的原因......这样做会使一些(非常好的)答案脱离背景,我的坏。

10 个答案:

答案 0 :(得分:3)

System.Configuration.ConfigurationManager.ConnectionStrings和System.Configuration.ConfigurationManager.AppSettings 包含来自正在执行的应用程序的设置,因此在DAL中,您可以获取存储在web.config文件中的设置。

对于您的系统,您可以创建一个自定义配置部分,该部分将位于您的web.config文件或DAL的使用者* .config文件中。在这些配置文件中,您可以指定从设计和位置的单独配置文件加载它们。 Referencing external config files from Web.Config How to: Create Custom Configuration Sections Using ConfigurationSection

另外,您可以使用ConfigurationManager.OpenExeConfiguration

从任何文件手动加载DAL配置数据

答案 1 :(得分:2)

您可以将等效项添加到名为app.config的web.config文件中,该文件将编译为为您的代码隐藏的dll或exe项目命名的文件。这是完全可变的,无需重新编译。您可以使用连接字符串的标准设置和可以在键/值对中定义的各种应用程序设置 - 或者您可以使用更多的工作来定义自己的自定义配置设置类和部分。您甚至可以在应用程序配置中引用设置 - 这样您可以在应用程序(DEV,QA,PROD)中存储3个设置,然后在app.config文件中仅引用运行时所需的设置。以下是为Web服务设置创建的示例。

<?xml version =“1.0”encoding =“utf-8”?>
<结构>
< configSections>
< sectionGroup name =“applicationSettings”type =“System.Configuration.ApplicationSettingsGroup,System,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”>
< section name =“{Project} .Properties.Settings”type =“System.Configuration.ClientSettingsSection,System,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”requirePermission =“false”/>
< / sectionGroup>
< section name =“microsoft.web.services3”type =“Microsoft.Web.Services3.Configuration.WebServicesConfiguration,Microsoft.Web.Services3,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”/>
< / configSections>
<&的applicationSettings GT;
< {项目} .Properties.Settings>
< setting name =“{SettingName}”serializeAs =“String”>
<值GT; {SettingValue}< /值GT;
< /设定>
< / {项目} .Properties.Settings>
< /&的applicationSettings GT;
< microsoft.web.services3>
<安全>
< securityTokenManager>
< add type =“Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager,Microsoft.Web.Services3,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”namespace =“http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" localName =” UsernameToken“/>
< / securityTokenManager>
< /安全>
< /microsoft.web.services3>
< /结构>

答案 2 :(得分:2)

听起来你不明白web.config / app.config是如何工作的,如果我正确地读你的话。假设您有如下结构:

DAL项目

参考文献:

  • 一些核心库
  • 杂项参考

类:

  • DatabaseHelper
  • ObjectClass1
  • ObjectClass2
  • 等...

网络项目

参考文献:

  • 一些核心库
  • DAL项目
  • 杂项参考

页数:

  • Default.aspx的
  • SomePage1.aspx
  • 等...
  • 的Web.config

在DatabaseHelper类中,您可以引用连接字符串,如下所示:

string connString = ConfigurationManager
  .ConnectionStrings["myConnString"]
  .ConnectionString;

如果在运行时发生这种情况,您的DatabaseHelper类将在与您的网页相同的应用程序域下运行,因此,对ConfigurationManager的任何调用都将从Web项目提供的web.config文件加载请求。

因此,您只需要在web / console / winforms / etc ...项目中使用一个配置文件,而不必担心在每个类库项目中都有一个配置文件。

如果您实际将DAL作为服务或单独的控制台应用程序运行,那么只有这样您才需要为DAL项目提供自己的app.config / web.config文件。

答案 3 :(得分:1)

完全不同的方法是使用SQLite并将所有应用程序设置存储在那里。如果这对应用程序很重要,您可以使用密码保护有问题的数据库,并且可以创建一些简单的属性/值表来存储数据。

使用SQLite ADO adapter只需要在项目中添加1个DLL来访问设置,那些不想使用Visual Studio的人可以访问SQLite DB本身。甚至还有一个Firefox插件可以与SQLite数据库进行交互。

答案 4 :(得分:1)

拆分它。使用固定XML存储文件解决方案进行数据库连接,使用.NET的内置加密器功能加密(不要自行滚动)。然后,使用生成的数据库连接,在数据库中查找“设置表”。这样,您无需重新部署即可修改设置。如果您的客户需要能够在没有visual studio的情况下更改数据库连接字符串,只需编写一个小型Windows窗体应用程序,该应用程序能够生成加密的连接字符串并保存固定XML存储文件,如有必要,还可以连接到DB(通过相同的文件)并根据用户需要修改Settings表。

答案 5 :(得分:1)

您可以将设置存储在任何旧的Xml文件中,并使用XmlSerializer获取您的类并将其转换为< - >来自Xml。在另一个answer我写了一些代码就是这样做的。链接的答案序列化了一个简单对象列表,但它也可以序列化一个大型配置对象。

因为XmlSerializer序列化到/来自公共属性,如果您不想允许值更改,您可能需要使类本身不可变(popsicle样式)或者具有位于前面的只读外观反序列化。

这是一个方便的技巧。您可以通过ConfigurationManager.AppSettings []使用它自己的配置部分和外部文件引用来设置它,或者您也可以只为每个配置类硬编码一个特定的xml文件名。

答案 6 :(得分:1)

看看 Config.Net - .NET开发人员最简单的配置框架

全面易用且功能强大的.NET配置库,其中包含单元测试,并在数千个服务器和应用程序上进行了野外测试。

答案 7 :(得分:0)

您可以使用一个界面来映射您在DAL上使用的设置。然后在应用程序上,您可以使用IoC将设置提供给DAL。

答案 8 :(得分:0)

如果您正在使用DI框架(如Unity),则可以指定构造函数参数。因此,假设您的DAL提供程序可以有一个构造函数来获取其连接字符串。

我知道你不能在接口中强制构造器,但这是我们必须处理的事情。我知道框架有一些地方存在构造函数签名的未说明的依赖...

答案 9 :(得分:0)

看看DslConfig。这似乎解决了你正在寻找的问题。