将连接字符串放在 applicationSettings 中有什么问题吗?

Anything wrong with putting connection strings in applicationSettings?

.NET 支持多种存储配置设置的方法已经有一段时间了,这导致了很多混乱。在这个受人尊敬的网站上搜索 "Settings in C#" over on MSDN are ten years old (and many of the related questions [2] 的前三名也是 6-7 岁),这无济于事。确实很难确定哪些早期建议已被弃用。

在我的项目中,我选择使用 ApplicationSettings(而不是 AppSettings),因为:

  1. 这似乎是 current recommended approach on MSDN (and here)。
  2. AppSettings元素appears to be deprecated as of .NET 4+* (topic is "no longer available"; but see "Other Versions" on that page.) [*Although, confusingly, the AppSettings Property is still supported]
  3. 我更喜欢在设计器工具中编辑设置,而不是 xml 编辑器。
  4. 我更喜欢强类型设置。

但是,现在我需要决定将连接字符串放在哪里。关于 MSDN (and here on SO, as well as CP) 的最新文档似乎仍然建议使用 app.config<connectionStrings> 部分。但是从代码访问它需要使用旧语法,我现在认为它与 appSettings 一起过时了。换句话说,用旧语法读取 app.config 文件的一部分是没有意义的:

ConfigurationManager.ConnectionStrings["MydDBConnName"];

和同一文件的另一部分使用 new 语法:

Properties.Settings.Default.myOtherSetting;

此外,它使我无法在设计器中编辑字符串。

所以底线:有什么理由不在 ApplicationSettings 元素中标准化我的所有配置设置(包括连接字符串)?

ConnectionStrings 部分不仅允许您在配置中定义 连接字符串 ,还允许您选择 提供程序 ,因此您的代码可以(理论上)使用 DbConnectionDbCommand 等的任何子类

然而,实际上,支持这种灵活性意味着您必须使用提供者不可知的 SQL 语句(这意味着您不能做没有标准 [= 的日期数学之类的事情) 26=] 语法),并且需要更多 "plumbing" 代码来创建正确类型的对象。你可以看到一些例子 here.

如果您只支持一个数据库提供程序(SQL 服务器、Oracle、ODBC、OleDB),那么在字符串应用程序设置上使用 ConnectionStrings 并没有真正的好处。

我认为 ApplicationSettings 元素仅用于组织。如果您在 Entity Framework 或大多数其他数据库连接中注意到,它们会将它们存储在 ConnectionStrings 元素下的配置中。我唯一担心的是存储任何类型的敏感数据,例如连接用户和密码。一种常见的解决方法是允许 Windows 身份验证处理连接。

我建议您保持 类 设置源不可知。

例如,如果您有一个需要连接字符串的 DatabaseContext,则在构造函数中注入该 primitive dependency。不要直接通过 ApplicationSettings.

定位连接字符串

从您的 类 定位原始依赖项(例如设置)与使用 Service Locator anti-pattern.

完全相同

应用程序中唯一应该获取设置(例如连接字符串)的位置是 Composition Root。因此,您可以在此处从 ApplicationSettings 获取设置并将它们注入您的 类.

如果您想对 storing/retrieving 设置使用不同的方式,这可以让您稍后改变主意。

标准就是你做出来的。例如,在我当前的工作环境中,特定应用程序中唯一变化的信息是服务器名称。我们有 dev/test/prod 个服务器。因此我们只在配置文件中存储 SQL 服务器名称。数据库名称不变。我们只是从配置文件中读取数据库服务器并在应用程序中构建字符串。

正如您在所链接的页面上一定已经读到的那样,使用 <connectionStrings> 的主要好处是它提供了加密字符串的机制,以便不以明文形式保存密码。如果您使用 Windows 身份验证来连接到数据库,那么我猜您不需要它,而且您将连接字符串放在哪里并不重要。这只是执行此操作的标准方法。

不过,我认为您说 'old syntax' 已弃用是错误的。例如,<appSettings> 仍然记录在案,it just changed the address。如果是的话,它会带来灾难。这不是我的领域,但我认为你所说的 'new syntax' 是在桌面应用程序中访问设置的方式,你在服务器端应用程序中没有它。