Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用程序设置中放置连接字符串有什么问题吗?_C#_.net_Connection String_Application Settings_Appsettings - Fatal编程技术网

C# 在应用程序设置中放置连接字符串有什么问题吗?

C# 在应用程序设置中放置连接字符串有什么问题吗?,c#,.net,connection-string,application-settings,appsettings,C#,.net,Connection String,Application Settings,Appsettings,NET在相当长的一段时间内支持多种存储配置设置的方法,这导致了大量的混乱。搜索的前三名点击率都是十年前的(而这个古老网站上的许多点击率也是6-7年前的),这对搜索没有帮助。很难确定哪些早期建议后来被否决了 在我的项目中,我选择使用ApplicationSettings(与AppSettings)是因为: 这似乎是(和) AppSettings元素*(主题为“不再可用”;但请参见该页上的“其他版本”。[*不过,令人困惑的是,AppSettings属性] 我更喜欢在设计器工具中编辑设置,而不是在xm

NET在相当长的一段时间内支持多种存储配置设置的方法,这导致了大量的混乱。搜索的前三名点击率都是十年前的(而这个古老网站上的许多点击率也是6-7年前的),这对搜索没有帮助。很难确定哪些早期建议后来被否决了

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

  • 这似乎是(和)
  • AppSettings
    元素*(主题为“不再可用”;但请参见该页上的“其他版本”。[*不过,令人困惑的是,AppSettings属性]
  • 我更喜欢在设计器工具中编辑设置,而不是在xml编辑器中
  • 我更喜欢强类型设置
  • 但是,现在我需要决定将连接字符串放在哪里。关于(和以及)的最新文档似乎仍然建议使用
    app.config
    部分。但是从代码中访问这个代码需要使用旧的语法,我现在认为它与AppSt设置一起过时了。换句话说,使用旧语法读取
    app.config
    文件的一部分是没有意义的:

    ConfigurationManager.ConnectionStrings["MydDBConnName"];
    
    以及同一文件的另一部分,语法如下:

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


    所以最重要的一点是:
    ApplicationSettings
    元素中的所有配置设置(包括连接字符串)是否有理由不标准化?

    部分允许您不仅在配置中定义连接字符串,还允许您选择提供程序,这样您就可以编写代码了(理论上)使用
    DbConnection
    DbCommand
    等的任何子类

    然而,在现实中,支持这种灵活性意味着您必须使用与提供程序无关的SQL语句(这意味着您不能做没有标准SQL语法的日期数学之类的事情),并且需要更多的“管道”代码来创建正确类型的对象。您可以看到一些示例


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

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

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

    例如,如果您有一个需要连接字符串的
    DatabaseContext
    ,则将其注入构造函数中。不要通过
    ApplicationSettings
    直接定位连接字符串

    从类中查找基元依赖项(例如设置)与使用完全相同

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


    如果您想使用不同的方式存储/检索设置,这允许您以后改变主意。

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

    正如您在链接到的页面上所读到的,使用
    的主要好处是它提供了加密字符串的机制,以避免如果你使用Windows身份验证连接到数据库,那么我想你不需要它,而且不管你把连接字符串放在哪里。这只是一种标准的方法


    然而,我相信你错认为“旧语法”已被弃用。例如,
    。如果它被弃用的话,它将带来灾难。这不是我的领域,但我认为你所说的“新语法”是访问桌面应用程序中设置的方式,而服务器端应用程序中没有这种方式。

    是“标准化”吗在这种情况下,意味着您的类将通过使用
    ApplicationSettings
    ?@YacoubMassad:是的,我想获取所有设置,包括使用语法
    Properties.settings.Default.x
    的连接字符串。您是enitiy framework还是纯ado.net?@BlackFrog:否framework。直接的C#@IanP:我看到了那篇文章(甚至链接到了它)。但是它已经有将近7年的历史了,选择的答案指向了将近10年的文章。当然,但我现在创建的是合成根(或者更具体地说,数据访问层),所以这并不能真正回答我的问题。(我必须在代码中的某个地方获取设置数据)。复合根可以隔离问题,但不能消除它。@kmote,您的数据访问层是否存在于它自己的应用程序/进程中?目前,是的。(它只是一个类,有几个简单的方法).但我恐怕看不出这与我的问题有什么关系。根据你在我询问“标准化”的含义时给出的答案,我认为(我现在似乎错了),你是在问你是否应该使用
    应用程序设置
    
    Properties.Settings.Default.myOtherSetting;