如何避免循环依赖:DAL.DbContext.DbSet <bll.model> </bll.model>

时间:2013-04-10 18:41:09

标签: c# entity-framework architecture interface dependency-injection

如果DbContext在DAL中,那么DbSets的泛型类型参数不能是BLL类(域模型)。分离这些图层的最佳做法是什么? DAL中的额外型号?接口

3 个答案:

答案 0 :(得分:3)

如果您正在进行DDD,我相信存储库(至少是它的接口)是您的业务/域层的一部分。您对存储库的实现将是一个单独的程序集,必须引用该业务/域层。所以你的DAL知道你的业务对象,但不是相反。要进行依赖注入,您可能在DAL层中有一些配置容器的东西,以使用Repository作为您的IRepository接口。如果您需要一个工作单元,您的界面可能也必须是业务层的一部分。再次,您的实现将在您的DAL中,DAL将适当地配置DI容器。这实际上是我对存储库模式不喜欢的事情之一,因为您需要确保您的接口用户正确地管理IUnitOfWork,或者您需要一些东西来包装存储库这样做。

在传统的n层架构中,情况有所不同。在这种情况下,您的业务层可以与DAL通信,我通常构建DAL以使DTO代表数据库中的一行数据。然后,业务层将使用这些DTO来水合业务对象(或者如果您使用的是CSLA.Net,业务对象知道如何自己保湿)。

无论哪种方式,都不应该出现循环引用的情况。

答案 1 :(得分:1)

我通常将域模型视为一个单独的层 如果我们看一下经典的MVC paradaigm,那么View和Controller都会使用该模型 DAL也不应该使用它。

然而,该模型不会引用DAL;对数据存储的所有操作都将由控制器完成。

所以事情的总体流动将是 -
用户与View进行互动 View调用Controller上的方法 Controller使用DAL来检索Model个对象 Controller调用Model个对象上的方法,必要时保存它们(使用DAL),并返回View

的答案

答案 2 :(得分:0)

您的BLL或域层不应该担心数据访问技术细节,BLL应该是技术独立的。如果你想坚持使用Entity框架,你应该生成POCO实体并将它们移动到单独的层,这样你就可以避免使用循环参考。