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

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

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

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

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

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

    为了解决这个问题,在我们最近的一些项目中,我们引入了第三个仅用于设置的项目。我们把场景放在一个系统中。正在设置文件。..使用简单的包装器,很容易实现为各种环境(开发、质量保证、暂存、生产等)设置不同设置的能力。

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

    那么,这方面有最佳实践吗?我有一种感觉,我正在重新发明轮子。

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

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

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

    系统。配置。配置管理器。连接字符串和系统。配置。配置管理器。应用程序设置 包含执行应用程序的设置,以便在DAL中可以获取存储在web.config文件中的设置。

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

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

        2
  •  3
  •   Aaron Fischer    16 年前

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

    <?xml版本=“1.0”编码=“utf-8”?>
    <配置>
    <configSections>
    <sectionGroup name=“applicationSettings”type=“System.Sonfiguration.applicationSettings组,系统,版本=2.0.0.0,区域性=中性,公钥令牌=b77a5c561934e089”>
    <section name=“{Project}.Properties.Settings”type=“System.Sonfiguration.ClientSettingsSection,System,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”requirePermission=“false”/>
    </sectionGroup>
    <section name=“microsoft.web.services3”type=“microsoft.web.services3.配置.WebServices配置,microsoft.web.Seervices3,版本=3.0.0.0,区域性=中性,公钥令牌=31bf3856ad364e35”/>
    </configSections>
    <应用程序设置>
    <{项目}。属性。设置>
    <setting name=“{SettingsName}”serializeAs=“String”>
    <值>{设置值}</值>
    </设置>
    </{项目}。属性。设置>
    </应用程序设置>
    <microsoft.web.services3>
    <安全>
    <securityTokenManager>
    <add type=“Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager,Microsoft.Web.Seervices3,版本=3.0.0.0,区域性=中性,公钥令牌=31bf3856ad364e35”命名空间=“ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&quot ;localName=“UsernameToken”/>
    </securityTokenManager>
    </安全>
    </microsoft.web.services3>
    </配置>

        3
  •  2
  •   silverbugg    16 年前

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

    DAL项目

    参考文献

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

    课程:

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

    Web项目

    参考文献

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

    页:

    • 页面
    • SomePage1.aspx
    • 等。。。
    • web.config文件

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

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

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

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

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

        4
  •  2
  •   Chris    16 年前

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

        5
  •  1
  •   Dillie-O    16 年前

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

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

        6
  •  1
  •   Community CDub    8 年前

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

    因为XmlSerializer在公共属性之间进行序列化,如果你不想允许值更改,你可能需要使类本身不可变(冰棒风格),或者在反序列化的外观前面有一个只读的外观。

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

        7
  •  1
  •   Gabrielizalo    7 年前

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

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

        8
  •  0
  •   Bruno Shine    16 年前

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

        9
  •  0
  •   Will    16 年前

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

    我知道你不能在接口中强制构造函数,但这是我们必须处理的问题。我知道这个框架有一些地方对构造函数签名有潜在的依赖关系。..

        10
  •  0
  •   Johannes    13 年前

    看一看 DslConfig 。这似乎解决了你要找的问题。

    推荐文章