如果 DbContext 在 DAL 中,则 DbSet 的泛型类型参数不能是 BLL 类(域模型)。分离这些层的最佳实践方法是什么?DAL 中的额外模型?接口?
3 回答
如果您正在做 DDD,我相信存储库(至少是它的接口)是您的业务/领域层的一部分。您的存储库实现将是一个单独的程序集,必须引用该业务/域层。因此,您的 DAL 知道您的业务对象,但反之则不然。要进行依赖注入,您可能会在 DAL 层中配置容器以将 Repository 用于 IRepository 接口。如果您需要一个工作单元模式,您的界面可能也必须是业务层的一部分。同样,您的实现将在您的 DAL 中,并且 DAL 将适当地配置 DI 容器。这实际上是我不喜欢存储库模式的地方之一,
在传统的 n 层架构中,情况有些不同。在这种情况下,您的业务层可以与 DAL 通信,并且我通常构建 DAL 以具有代表数据库中一行数据的 DTO。然后,业务层将使用这些 DTO 来对业务对象进行水合(或者,如果您使用的是 CSLA.Net 之类的东西,那么业务对象知道如何对自己进行水合)。
无论哪种方式,都不应该出现最终得到循环引用的情况。
我通常将域模型视为一个单独的层。
如果我们看一下经典的 MVC 范式,那么 View 和 Controller 都会使用该模型。
DAL 也没有理由不使用它。
然而,模型不会引用 DAL;针对数据存储的所有操作都将由控制器完成。
所以事情的一般流程是——
用户与View
View
调用方法交互Controller
Controller
使用DAL
检索Model
对象
Controller
调用对象的方法,如果需要,Model
保存它们(使用DAL
),并返回一个答案到View
您的 BLL 或域层不应该担心数据访问技术细节,BLL 应该是技术独立的。如果你想坚持使用实体框架,你应该生成 POCO 实体并将它们移动到单独的层,这样你可以避免循环引用。