【问题标题】:Alternatives to using web.config to store settings (for complex solutions)使用 web.config 存储设置的替代方案(用于复杂的解决方案)
【发布时间】:2008-11-20 17:39:22
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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












      {SettingValue}
      设置>
      {项目}.Properties.Settings>




      http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" localName="UsernameToken" / >

      安全>

      配置>

      【讨论】:

        【解决方案3】:

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

        DAL 项目

        参考文献:

        • 一些核心库
        • 其他参考文献

        类:

        • 数据库助手
        • ObjectClass1
        • ObjectClass2
        • 等等……

        网络项目

        参考资料:

        • 一些核心库
        • DAL 项目
        • 其他参考文献

        页数:

        • 默认.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 文件。

        【讨论】:

        • 这里缺少的部分在我的编辑中。 DAL 需要在不同的应用程序域中可用,也就是说,它最终也会在我们正在构建的初始网站之外的其他地方使用。
        • 那么每个不同消费者应用程序的 web.config / app.config 应该引用一个单独的配置部分 xml 文件,如下所述:forums.subsonicproject.com/forums/t/3944.aspx
        • 有趣,不确定这是否直接回答了问题,但这是很好的信息。谢谢。
        【解决方案4】:

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

        【讨论】:

        • 我这样做已经有一段时间了,它很棒。在 Web.Config 中,我只存储了一个连接字符串和一个名为“环境”的变量,其中包含像生产、暂存、开发这样的值。然后在数据库中有一个名为 Settings 的表,其中包含所有不同环境的所有设置。我使用 RedGate 的 SQL 数据比较来保持所有同步。
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

            • 这个问题目前已有 10 年历史,但也许有人会从中受益。 :)
            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                • 它不再可用了!
                猜你喜欢
                • 2020-08-29
                • 1970-01-01
                • 2018-07-24
                • 1970-01-01
                • 2012-02-02
                • 2011-04-13
                • 2016-10-24
                • 1970-01-01
                • 2021-12-22
                相关资源
                最近更新 更多