2

按照此处MVC3 和 Entity Framework提出的设计,我正在尝试使用 MVC4 + EntitiFramework5 为 DAL、BL 和 web 创建不同的层。

引用@Davide Piras

1 - ProjectName.Interfaces(类库,实体的接口);

2 - ProjectName.DAL(类库,唯一允许知道使用 EF 的库,POCO 实体使用另一个文件实现项目 1 的接口,在该文件中您使用部分类重新声明相同的对象......);

3 - ProjectName.BL(类库,业务逻辑,引用上面1和2的两个项目);

4 - ProjectName.Web(ASP.NET MVC 应用程序,表示层,引用两个项目 1 和 3,但不是 2);

我对 BL 和 DAL 之间的联系有疑问。DAL 知道 EF,BL 不应该.. 但是如何实现呢?我的意思是,我在两个层上都创建了代表我的实体的类(这对我来说似乎有点重复......即使在 BL 中我将添加验证和其他 sutff),但是我如何将数据库值公开给 BL ?

在我拥有的默认 MVC4 解决方案中

 DbSet<Entity> entity

我可以查询(.Find等)..我想我需要在我的BL中映射它们(IQueryable?IEnumerable?Isomething??)

完全困惑..任何帮助表示赞赏

4

2 回答 2

3

当您谈到 DAL 和 EF 时,界限可能会变得有些模糊。在某些情况下,您可以考虑 EF DAL。但我通常没有 BL 直接访问 EF 并将其抽象到更高级别,以便您可以在需要时轻松地将 EF 换成您的ORM。我使用存储库设计模式来进一步抽象 EF。这种模式的另一个优点是它使单元测试更容易,并且您可以使用依赖注入。我也使用工作单元设计模式处理系统中的事务。DAL 的存储库和工作单元也是如此,或者它只是 EF。这可能是值得商榷的,我知道自己更关心尝试定义 DAL。以下是我建议在 MVC 4 项目中使用的层。

MVC 4 架构

应用程序或域层是您的 BL 层。我倾向于将服务层中使用的概念合并到这一层中,因为我还没有看到将其分离出来的任何好处。但是也可以选择在顶部添加这一层。

于 2013-01-24T14:11:27.103 回答
1

不,业务逻辑层需要了解 DAL,因为它需要调用 DAL 上的方法才能检索/更新/添加数据(仅使用接口,不应允许查看 POCO 类)。BL 对 EF 一无所知(这是应该的,以防您想用其他东西替换 EF)。

因此,例如添加一条新记录:

  • 用户添加新的详细信息并提交表单
  • Web 项目在 BL 层调用 AddItems(使用作为接口的对象列表)

  • BL 项目有一些业务逻辑,在将对象列表传递给 DAL 之前的额外验证(也可能也有错误处理)

  • DAL 在数据库中创建项目,然后,如果需要,将接口列表传回
于 2013-01-24T13:18:32.383 回答