连接字符串应该存储在n层asp.net应用程序中的哪个位置

时间:2010-09-29 20:00:06

标签: asp.net web-config data-access-layer n-tier-architecture 3-tier

民间,

我有一个非常n层的ASP.NET项目,按名称空间,但我需要分成三个项目:数据层,中间层和前端。

我这样做是因为......

A)这似乎是正确的,

B)我遇到了为ASP.NET托管程序集运行单元测试的各种问题。

无论如何,我的问题是,你在哪里保留配置信息?

现在,例如,我的中间层类(使用Linq to SQL)在实例化新数据上下文时会自动从web.config中提取连接字符串信息。

如果我的数据层在另一个项目中,可以/应该使用web.config来获取配置信息吗?

如果是这样,单元测试(通常在单独的程序集中)如何提供soch配置信息?

感谢您的时间!

3 个答案:

答案 0 :(得分:2)

我们将它们保存在全局“设置”文件中,该文件恰好是XML。此文件包含所有GLOBAL设置,其中一个是指向相应服务器的连接字符串以及用户名和密码。然后,当我的应用程序使用它时,他们将所需的特定目录(数据库)放在连接字符串中。

我们为每个操作环境(prod,dev,staging等)提供了一个文件版本。然后,使用两个设置 - 文件路径(带有表示环境的标记)和环境 - 我可以选择正确的设置文件。

这也有30秒故障转移的好处。简单地更改设置文件中的服务器名称并重新启动应用程序(Web)并进行故障转移(当然,如果需要,您必须恢复数据)。

然后,当应用程序启动时,我们将正确的连接字符串写入web.config文件(如果它不同)。有了这个,我们可以通过更改一个appSettings值将网站从DEV更改为PROD。

答案 1 :(得分:2)

只要没有太多,就可以在web.config中使用它。当然,你的DAL应该完全不知道它来自那里。

一个很好的选择是,当您的数据层被要求执行某些操作时,它会被赋予其配置信息,并且当Web呼叫进入时,它将被要求执行某些操作。继续将信息放入您的数据层中web.config中。在我当前的项目中,我的数据层中有一个连接字符串的静态字典,我在从global.asax调用的例程中填写了这样的字典:

CAPPData.ConnectionStrings(DatabaseName.Foo) = 
    ConfigurationManager.ConnectionStrings("FooConnStr").ConnectionString()
CAPPData.ConnectionStrings(DatabaseName.Bar) = 
    ConfigurationManager.ConnectionStrings("BarConnStr").ConnectionString()
etc.

“注入”它就像一样可以用于自动测试目的,具体取决于您是否/如果您测试DAL。对我来说,这只是因为我不想制作单独的配置文件。

答案 2 :(得分:0)

出于测试目的,不要使用默认ctor实例化DataContext。将连接字符串信息传递给构造函数。

我更喜欢使用IoC框架将连接注入数据上下文,然后将上下文注入其他类。