【发布时间】:2011-06-01 02:18:54
【问题描述】:
我正在使用实体框架实现 DAL。在我们的应用程序中,我们有三层(DAL、业务层和表示层)。这是一个网络应用程序。当我们开始实现 DAL 时,我们的团队认为 DAL 应该有类,其方法接收业务层上的服务提供的 ObjectContext 并对其进行操作。这个决定背后的基本原理是不同的 ObjectContext 看到不同的 DB 状态,因此某些操作可能会由于外键匹配问题和其他不一致而被拒绝。
我们注意到,从服务层生成和传播对象上下文会在层之间产生高度耦合。因此,我们决定使用 Automapper 映射的 DTO(不是非托管实体或自跟踪实体,它们争论高耦合,将实体暴露给上层且效率低)和 UnitOfWork。所以,这是我的问题:
- 这是设计 Web 应用程序 DAL 的正确方法吗?为什么?
- 如果您对 1. 的回答是“是”,如何协调 DTO 的概念与 UnitOfWork 模式?
- 如果您对 1 的回答为“否”,那么哪种方法可能是为 Web 应用程序设计 DAL 的正确方法?
如果可能,请提供支持您答案的参考书目。
关于目前的设计:
该应用程序计划在三层上开发:表示层、业务层和 DAL。业务层既有门面又有服务
有一个名为 ITransaction 的接口(只有两种方法来处理和保存更改)仅在服务中可见。为了管理事务,有一个类 Transaction 扩展了 ObjectContext 和 ITransaction。我们在设计这一点时考虑到在业务层我们不希望其他 ObjectContext 方法可访问。
在 DAL 上,我们使用两种通用类型(一种用于实体,另一种用于其关联的 DTO)创建了一个抽象存储库。此存储库具有以通用方式实现的 CRUD 方法和两个通用方法,用于使用 AutoMapper 映射通用存储库的 DTO 和实体。抽象存储库构造函数将 ITransaction 作为参数,并且它期望 ITransaction 是 ObjectContext,以便将其分配给受保护的 ObjectContext 属性。
具体的存储库应该只接收和返回 .net 类型和 DTO。
我们现在正面临这个问题:创建的通用方法不会为附加实体生成临时或持久 id(直到我们使用SaveChanges(),因此破坏了我们想要的事务性);这意味着服务方法不能使用它来关联 BL 中的 DTO)
【问题讨论】:
标签: c# design-patterns entity-framework-4 data-access-layer .net-4.0