4

在我们的 Web 应用程序中,我们将数据访问层分离到它们自己的项目中。

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

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

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

唯一的问题是设置项目(包括 .Settings 类)编译成程序集,因此您无法在不进行构建/部署的情况下更改它,并且我们的一些客户希望能够在没有 Visual 的情况下配置他们的项目工作室。

那么,是否有最佳实践呢?我有这种感觉,我正在重新发明轮子。

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

编辑:最初的问题没有包含我们不能(我认为)使用 web.config 的真正深刻的原因......这让一些(非常好的)答案脱离了上下文,我的错。

4

10 回答 10

3

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

对于您的系统,您可以创建一个自定义配置部分,该部分将位于您的 web.config 文件或 DAL 的 consumer*.config 文件中。在这些配置文件中,您可以指定它们从您的设计和位置的单独配置文件中加载。 从 Web.Config 引用外部配置文件 如何:使用 ConfigurationSection 创建自定义配置部分

或者,您可以使用ConfigurationManager.OpenExeConfiguration从任何文件手动加载 DAL 配置数据

于 2008-11-20T17:52:51.747 回答
2

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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>
    <{Project}.Properties.Settings>
      <setting name="{SettingName}" serializeAs="String">
        <value>{SettingValue}</value>
      </setting>
    </{Project}.Properties.Settings>
  </ applicationSettings>
  <microsoft.web.services3>
    <security>
      <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>
    </security>
  </microsoft.web.services3>
</配置>

于 2008-11-20T18:05:07.790 回答
2

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

DAL 项目

参考:

  • 一些核心库
  • 杂项参考

课程:

  • 数据库助手
  • 对象类 1
  • 对象类 2
  • ETC...

网络项目

参考:

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

页数:

  • 默认.aspx
  • SomePage1.aspx
  • ETC...
  • 网页配置

在您的 DatabaseHelper 类中,您可能会像这样引用连接字符串:

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

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

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

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

于 2008-11-20T18:19:24.047 回答
1

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

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

于 2008-11-20T18:10:42.553 回答
1

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

于 2008-11-20T18:15:53.790 回答
1

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

因为 XmlSerializer 序列化到公共属性/从公共属性序列化,如果您不想让值更改,您可能需要使类本身不可变(冰棒风格)或具有位于反序列化前面的只读外观。

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

于 2008-11-20T20:45:19.870 回答
1

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

A comprehensive easy to use and powerful .NET configuration library, fully covered with unit tests and tested in the wild on thousands of servers and applications.

于 2018-07-25T16:21:23.843 回答
0

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

于 2008-11-20T17:54:15.503 回答
0

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

我知道你不能在接口中强制使用构造函数,但这是我们必须处理的事情。我知道框架有几个地方对构造函数签名存在不言而喻的依赖......

于 2008-11-20T18:17:41.697 回答
0

看看DslConfig。看来这可以解决您正在寻找的问题。

于 2012-02-10T17:56:15.640 回答