代码之家  ›  专栏  ›  技术社区  ›  Brian MacKay

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

  •  4
  • Brian MacKay  · 技术社区  · 16 年前

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

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

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

    为了解决这个问题,在我们最近的一些项目中,我们引入了第三个项目作为设置。我们把设置放在一个.setting文件系统中…使用一个简单的包装器,对于各种环境(dev、qa、staging、production等)具有不同设置的能力很容易实现。

    唯一的问题是,设置项目(包括.settings类)编译成一个程序集,因此在不进行生成/部署的情况下无法对其进行更改,并且我们的一些客户希望能够在不使用Visual Studio的情况下配置其项目。

    那么,有没有一个最佳实践呢?我有种感觉,我在重新设计方向盘。

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

    编辑: 最初的问题没有包含我们不能(我认为)使用web.config的真正深入的原因…这使一些(非常好的)答案断章取义,我的错。

    10 回复  |  直到 6 年前
        1
  •  1
  •   GWLlosa    16 年前

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

        2
  •  3
  •   Aaron Fischer    16 年前

    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

        3
  •  2
  •   silverbugg    16 年前

    您可以添加一个名为app.config的web.config文件,该文件编译成一个名为后面代码的dll或exe项目的文件。这是完全可变的,不需要重新编译。您可以使用连接字符串的标准设置,以及可以在键/值对中定义的各种应用程序设置,或者您可以定义自己的自定义配置设置类和节。您甚至可以在应用程序配置中引用设置—这样,您可以在应用程序中存储3个设置(dev、qa、prod),然后只在运行时在app.config文件中引用所需的设置。下面是一个为Web服务设置创建的示例。

    <?xml version=“1.0”encoding=“utf-8”?gt;
    <配置>
    <配置部分>
    <sectiongroup name=“applicationsettings”type=“system.configuration.applicationsettingsGroup,system,version=2.0.0.0,culture=neutral,publicKeyToken=b7a5c561934e089”>
    <section name=“project.properties.settings”type=“system.configuration.clientsettings section,system,version=2.0.0.0,culture=neutral,publicKeyToken=b7a5c561934e089”requirePermission=“false”/>gt;
    </sectiongroup>
    <section name=“microsoft.web.services3”type=“microsoft.web.services3.configuration.webservicesConfiguration,microsoft.web.services3,version=3.0.0.0,culture=neutral,publickeytoken=31bf3856ad364e35”/>gt;
    </configSections>
    <应用程序设置>
    <项目.属性.设置>
    <setting name=“setting name”serializeas=“string”>
    <value>设置值</value>
    </设置>
    </项目.属性.设置>
    </applicationsettings>
    <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&quot ;localname=“usernametoken”/>
    </SecurityTokenManager>
    </security>
    </microsoft.web.services3>
    </configuration>

        4
  •  2
  •   Chris    16 年前

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

    DAL项目

    参考文献:

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

    Classes:

    • 数据库助手
    • 对象类别1
    • 对象类2
    • 等。。。

    网站项目

    参考文献:

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

    页:

    • 阿斯克斯
    • ASPEX
    • 等。。。
    • Web.CONFIG

    在您的databasehelper类中,您可以这样引用连接字符串:

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

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

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

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

        5
  •  1
  •   Dillie-O    16 年前

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

    使用 SQLite ADO adapter 只需要在项目中添加一个DLL就可以访问设置,而那些不想使用Visual Studio的人也可以访问sqlite db本身。甚至还有一个插件可以让火狐与sqlite数据库交互。

        6
  •  1
  •   Community CDub    7 年前

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

    因为xmlserializer在公共属性之间进行序列化,所以如果不希望更改值,则可能需要使类本身不可变(popsicle样式),或者在反序列化的类前面具有只读外观。

    这是一个很好的技巧。您可以通过configurationmanager.appsettings[]设置它,使用它自己的配置节和外部文件引用,或者您也可以为每个配置类硬编码一个特定的XML文件名。

        7
  •  1
  •   Gabrielizalo    6 年前

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

    一个全面的易于使用和强大的.NET配置库,完全覆盖了单元测试,并在数千台服务器和应用程序上进行了野外测试。

        8
  •  0
  •   Bruno Shine    16 年前

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

        9
  •  0
  •   Will    16 年前

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

    我知道您不能在接口中强制构造函数,但这是我们必须处理的事情。我知道这个框架有几个地方对构造函数签名有着无法言喻的依赖性…

        10
  •  0
  •   Johannes    13 年前

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