c# - 您在领域驱动设计中将 DbContext 放在哪里?
问题描述
我想在一个新项目中使用领域驱动设计。我的第一步是消除 DAL 项目(实体框架核心)专用的模型类,而是直接使用业务模型。
但是在这一步中,我遇到了循环依赖的问题,以及在哪里放置 DbContext 类。
假设我有两个项目——业务和数据。业务项目包含所有业务逻辑和相关实体模型。数据项目包含实体框架特定的东西——配置、迁移和 DbContext。
问题来自依赖关系。数据项目依赖于实体模型的业务项目(由配置和 DbContext 使用)。业务项目依赖于 DbContext 的数据项目,由业务逻辑使用。这个项目架构创建了一个依赖循环,我不知道如何打破。
我想到了几个(坏的)解决方案:
将 DbContext 移至业务项目
- 这将从业务项目中删除数据项目的依赖关系,但它也会用持久层的东西污染业务项目。
具有位于业务项目中的接口的抽象 DbContext。
- 这也将从业务项目中删除数据项目的依赖性。该接口首先需要公开数据库持久化的所有模型 DbSet,其次需要公开业务逻辑使用的所有 DbContext 属性和方法(至少 SaveChangesAsync,可能还有其他一些东西)。DbContext 扩展方法在使用接口时也不起作用。
将这种类型的域驱动设计与实体框架一起使用时,您如何解决这种依赖循环?
解决方案
您应该考虑仅将域实体传递给持久层中的存储库,以便您拥有 3 层
-应用层(你调用的业务层。这是由协调服务组成的)
- 域层(域实体类所在的位置)
-持久层(实现存储库和持久性实体的位置。这是域到持久性模型之间发生映射的地方,反之亦然)
您的存储库接口应该在域层中定义,而在持久层中它引用域层)
推荐阅读
- android - Dagger 2 的 AssistedInject 是如何工作的?
- python - 交换 pandas 字符串列中的两个子字符串
- go - 如何使用 golang 写入已打开的 .xlsx 文件
- css - 如何将凹矩形设置为凸矩形
- awk - 在文件中搜索号码
- python - 通过 pyodbc 在 MS SQL 中创建存储过程
- java - SpringBoot 应用程序中的主类
- flutter - Flutter 应用程序后退按钮事件未重定向到后页
- javascript - Angular - 在 *ngFor 中的最后一个元素上调用函数
- html - 十六进制颜色在 Chrome 移动地址栏中不起作用