在哪里写连接字符串? 在app.config或web.config中?

我正在开发MVC应用程序。 我的申请中有两个项目。 一个是MVC应用程序包含,Controller和Views,第二个是DataLayer项目。

我对编写连接字符串的位置感到困惑,因为在发布应用程序时它需要web.config文件,我从DataLayer项目获取数据,所以我应该在数据层的app.config / Web.config中添加连接字符串项目?

另外,想知道app.config和web.config之间的目的和区别是什么?

每个项目在创建时都带有配置文件。 通用类库有一个名为app.config的通用类。 Web项目更具体,因此其文件名为web.config并附带特定于Web的参数。 他们都有同样的目的。

您面临的问题是默认情况下仅部署可执行项目的配置文件(web.config)。 你有几个选择:

  1. 将连接字符串添加到web.config并将其传递给数据层。 这很简单(最常见),但将配置信息与数据层项目分开。
  2. 让您的数据层使用System.Configuration.ConfigurationManager读取web.config。 这可以减轻您将数据传递到数据层的影响,但会产生强依赖性(如果没有格式正确的web.config文件,您的数据层将无法工作)。
  3. 将app.config部署为XML内容并编写自定义代码,以便数据层可以读取它。 这是更多的工作,但它从Web配置中获取您的数据配置。
  4. 稍微更改为#2,您可以在web.config中创建名为“dataLayer”的自定义配置部分 。 这可以通过System.Configuration.ConfigurationManager读取。 我更喜欢这种方法,因为它看起来很平衡。 您在“默认”配置文件中有一个自定义强类型配置部分。

这个相关的问题也有一些很好的信息。

连接字符串位于Web.config中。 默认情况下,它将查看正在执行的程序集的配置,并忽略引用程序集的配置文件。

引用的程序集的配置文件可以在设计时使用。 例如,如果您在数据层程序集中使用Entity Framework,它将存储用于从app.config中的数据库构建模型的连接信息。

当我到达Web项目将要运行并通过数据层访问数据时,我通常只是将连接信息复制到web.config。

  • Web.Config用于asp.net Web项目/ Web服务。
  • App.Config用于Windows窗体,Windows服务,控制台应用程序和WPF应用程序。

数据层项目的 Web.config中添加连接字符串

我会首先回答你的问题,然后继续讨论什么,IMO是一个更重要的考虑因素。 对于这个特定的用例,我更喜欢DI模式,其中消费者告诉提供者连接字符串是什么。 这使您的数据层与数据库无关,并允许它与满足其合同的任何数据存储进行通信。 简而言之,由于您的MVC项目是数据层的使用者,因此连接字符串存储在web.config中。 但它被存储加密!!!

现在,这里实际上存在一个比你在物理上编写连接字符串更深层次的问题,那就是在你的消费代码和配置存储之间建立一个抽象。 如果这样做,存储配置值的位置变得基本无关紧要。

我总是在每个层(项目)中创建一个Configuration类,它提供该层中消耗的配置值。 这提供了几个好处:

  1. 它在使用时允许强类型值。 如果您的配置值是int,则会得到一个int,并且在使用它时不需要转换它。
  2. 它允许可能无意中遗漏配置文件的默认值。 这使您的代码更加健壮。
  3. 它允许您存储值的灵活性。 您可以在配置文件中放置一些值,在数据库中放置其他值,还可以从远程Web服务获取更多值。 如果您决定更改商店,则只需在一个地方编辑代码 – 而不是每个地方都会使用该值。
  4. 随着您的解决方案的增长和项目的增加,模式可以很好地扩展并保持配置的隔离。
  5. 它会从代码中删除魔术字符串。

而不是以下,有一个令人讨厌的魔术字符串:

 return System.Configuration.ConfigurationManager.AppSettings["DefaultUserName"]; 

你会写的

 MyApp.Configuration.DefaultUserName 

下面是一个非常基本的实现示例,它返回一个强类型(在本例中为DayOfWeek)。 它有一个帮助方法来帮助您抽象从商店拉出的行为。 如果需要包含多个存储,则此方法将采用类型为T的generics,其中T是存储的类型。 在下面的简化示例中,它只是从配置文件中提取:

  public class Configuration { private const DayOfWeek FailsafeDefaultDayOfWeek = DayOfWeek.Saturday; ///  /// A default for the day of week ///  public static DayOfWeek DefaultDayOfWeek { get { string dayOfWeekString = GetSettingValue("DefaultDayOfWeek"); try { return (DayOfWeek)Enum.Parse(typeof(DayOfWeek), dayOfWeekString); } catch (Exception) { // If someone screws up and forgets to include a value, or the value cannot be cast: return FailsafeDefaultDayOfWeek; } } } ///  /// Helper method to easily pull a value from a configuration store. ///  ///  ///  private static string GetSettingValue(string settingName) { try { return System.Configuration.ConfigurationManager.AppSettings[settingName]; } catch (Exception) { throw new MissingConfigurationValueException(settingName); } } }