4

我一直在寻找这个问题的答案,但之前提出的所有问题似乎都是一个复杂的变体,并且没有回答这个问题,所以我想我应该问一下。

我正在开发具有以下内容的三层应用程序......

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

我创建了一个实体框架模型、存储库类,我的连接字符串在 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 层结构的目的,那么最好的方法是什么?任何人都可以为我阐明这一点吗?

4

3 回答 3

2

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

于 2013-01-03T14:20:40.460 回答
0

按原样将连接字符串属性从 app.config 复制到 web.config 连接字符串部分...这将解决

于 2013-01-03T14:20:41.507 回答
0

连接字符串应该在您的表示层(在您的情况下为 mvc 项目)。只需connectionStrings在 web.config 中的节点上添加条目,然后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;
于 2013-01-03T14:23:12.673 回答