连接字符串 - N层应用程序

时间:2013-01-03 14:17:25

标签: c# asp.net entity-framework connection-string multi-tier

我已经有了解决这个问题的答案,但之前提出的所有问题似乎都是一个复杂的变化,并没有回答这个问题所以我想我应该问。

我正在开发一个包含以下内容的三层应用程序.....

  • DAL - 使用实体框架的数据访问层
  • BLL - 业务逻辑层
  • Web App - MVC Web应用程序

我创建了一个Entity Framework模型,存储库类和我的连接字符串位于DAL App.Config文件中。我现在已经在BLL中创建了我的第一个类,它引用了DAL。当试图测试以下,非常基本的方法我得到一个与BLL中缺少连接字符串有关的错误。

public static List<DAL.Item> getItems() {

        List<DAL.Item> result = new List<Item>();

        DAL.Repositories.ItemRepository myRepository = new    DAL.Repositories.ItemRepository();
        result = myRepository.GetAll().ToList();

        return result;

    }

BLL为什么要查找连接字符串?我错过了一些非常明显的东西吗?

如果我需要在多个层中包含连接字符串,这会破坏n层结构的目的,那么最好的方法是什么?任何人都可以为我阐明这一点吗?

3 个答案:

答案 0 :(得分:2)

你正在新建一个DAL实例,而后者将尝试查看你的配置文件(由于范围在业务层/单元测试中而找不到。你应该做的是查看Inversion Of控制(IoC)并将DAL注入业务逻辑层。然后你可以模拟你的DAL,它不会尝试并实际命中配置文件/数据库等。

答案 1 :(得分:0)

将连接字符串属性从app.config复制到web.config连接字符串部分......这个iwll解决方案

答案 2 :(得分:0)

连接字符串应位于表示层(在您的情况下为mvc项目)。只需在web.config中的connectionStrings节点上添加该条目,然后通过数据层上的System.Configuration读取该条目。

在web.config中定义一个连接字符串

<connectionStrings>
    <add name="ConnectionStringName" connectionString="Data Source=.\SQLEXPRESS; Database=DataBaseName;..." providerName="System.Data.SqlClient" />
</connectionStrings>

在Entity-Framework的DataContext中,您可以传递web.config文件中的密钥

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
        : base("ConnectionStringName")
    {
    }

    // DbSet properties...
}

要从配置文件中读取并获取字符串,您必须添加System.Configuration程序集的引用并尝试此操作:

using System.Configuration;

string connectionString = ConfigurationManager.ConnectionStrings["connectionStringName"].ConnectionString;