在C#中,为什么不将连接字符串显示为对象?

时间:2018-08-30 13:14:02

标签: c# .net entity-framework

我是否有任何特定原因需要我将连接字符串作为字符串而不是作为对象公开?我的意思是,如果我们可以在某种依赖注入服务公开的对象中设置完全相同的选项,为什么我们应该总是构造这种丑陋形式的字符串'Data Source=MSSQL1;Initial Catalog=AdventureWorks;Integrated Security=true'。或其他任何不需要我们全心学习关键字的事情。

3 个答案:

答案 0 :(得分:5)

TL; DR::主要原因是连接字符串应位于配置文件中。这意味着数据需要符合配置文件的格式。一个简单的字符串(而不是属性的集合)适用于每种类型的配置文件,并且不需要特定于格式的语法,例如JSON或XML配置文件。


第二,不是每个连接字符串都使用完全相同的属性。有些属性是互斥的(例如,集成安全性与登录凭据),某些属性对于不同的数据提供者具有不同的名称。

Connectionstrings.com是一个很好的例子,显示了不同的连接字符串。您会看到并不是每个字符串都使用了每个属性。

  

更新-This is a list of connection string properties用于专门连接到Analysis Services。甚至没有考虑其他数据提供者,并且看起来属性集合已经变得多么复杂。

如果要使一个对象代表您的连接字符串,则必须公开所有可能的属性,这比一般开发人员所需要的更多,从而造成很多冗余(和空)设置。

第三,您经常不只是更改连接字符串设置中的一个。连接字符串被视为一个整体,因为创建它们之后,您基本上可以使用“ DEV连接字符串”或“ TEST连接字符串”。
为此,将连接字符串简单地视为整个对象而不是属性集合通常更安全。

最后,如果您真的想通过其单独的属性定义连接字符串,则仍然可以这样做。 SqlConnectionStringBuilder就是出于这个目的而存在。

但是,由于我上面提到的原因,大多数开发人员并不构造自己的连接字符串,而是将它们用作配置键。

答案 1 :(得分:3)

您的问题可以分为两个部分。

首先,将连接设置表示为字符串的原因是因为它们通常是在配置中设置的,并且不会在应用程序的部署过程中发生变化。设置好之后,就设置好了,几乎不需要更改了。因此,通常只需要一个字符串来表示配置中的连接。简单明了。

第二,您绝对可以使用SqlConnectionStringBuilder类来使用对象来表示您的连接设置。您还没有听说过它,因为它使用不多,也没有使用太多,因为我们很少需要在运行时修改连接设置。我唯一使用SqlConnectionStringBuilder的时候是我想解析一个连接字符串来记录它而没有诸如密码之类的敏感比特。

答案 2 :(得分:1)

IMO最重要的原因是鼓励开发人员将 entire 连接字符串存储为配置参数。

这使您能够更改所需的连接字符串的任何部分,而无需重建和重新部署应用程序。

如果您选择使用配置参数来仅设置单个连接字符串参数(例如服务器名称和数据库名称),那么您将无法连接到命名实例,设置只读意图,调整连接池参数等,无需更改源代码。

可能的历史原因是,连接字符串因ADO.NET提供程序而异,并且ADO.NET旨在启用与提供程序无关的代码。从.NET 2.0开始,您甚至可以编写对特定ADO.NET提供程序没有编译时依赖性的端到端应用程序。参见ADO.NET Facory Model Overview