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

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

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

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

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

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

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

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

有帮助吗?

解决方案

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

其他提示

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

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

另外,您可以使用 ConfigurationManager.OpenExeConfiguration

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

<!> lt;?xml version = <!> quot; 1.0 <!> quot; <!>编码= QUOT; UTF-8 QUOT <!?> GT <!>;结果 LT <!>;配置GT <!>;结果 NBSP <!>; NBSP <!>; LT <!>; configSections GT <!>;结果 <!> <!> nbsp; <!> nbsp; <!> <!> <!> <!>

<!> <;>;应用程序设置<!> type = <!> quot; System.Configuration.ApplicationSettingsGroup,System,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089 <!> quot; <!> gt;
<!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> > {Project} .Properties.Settings <!> QUOT; type = <!> quot; System.Configuration.ClientSettingsSection,System,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089 <!> quot; <!> requirePermission = QUOT; <!>伪QUOT; / GT <!>;结果 NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; LT <!>; / sectionGroup GT <!>;结果 <!> <!> <!> <!> <!> <!> <!> <!> <!>
<!> <;> <!> <;>; microsoft.web.services3 <!> type = <!> quot; Microsoft.Web.Services3.Configuration.WebServicesConfiguration,Microsoft.Web.Services3,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 <!> quot; / GT <!>;结果 NBSP <!>; NBSP <!>; LT <!>; / configSections GT <!>;结果 NBSP <!>; NBSP <!>; LT <!>;的applicationSettings GT <!>;结果 NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; <!> LT; {项目} .Properties.Settings GT <!>;结果 <!> nbsp; <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!>设置名称= <!>“; {SettingName} <!>” ; <!> serializeAs = QUOT;字符串QUOT <!>; GT <!>;结果 NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; <!> LT; <!>值GT {SettingValue} LT <!>; /值GT <!>;结果 NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; LT <!>; /设置GT <!>;结果 NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; <!> LT; / {项目} .Properties.Settings GT <!>;结果 NBSP <!>; NBSP <!>; LT <!>; / GT的applicationSettings <!>;结果 NBSP <!>; NBSP <!>; LT <!>; microsoft.web.services3 GT <!>;结果 NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; <!> LT;安全GT <!>;结果 NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; NBSP <!>; LT <!>; securityTokenManager GT <!>;结果 <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!>添加类型= <! >“Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager,Microsoft.Web.Services3,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35 <!> quot; namespace = <!> quot;

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

达尔项目

参考:

  • 一些核心库
  • 杂项参考资料

课程:

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

网络项目

参考:

  • 一些核心库
  • 达尔项目
  • 杂项参考资料

页数:

  • 默认.aspx
  • 某页1.aspx
  • ETC...
  • 网页配置

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

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

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

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

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

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

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

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

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

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

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

全面易用且功能强大的.NET配置库,完全覆盖了单元测试,并在数千台服务器和应用程序中进行了全面测试。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top