如何在 DDD 中使用 EF DbContext 分离我的聚合

Posted

技术标签:

【中文标题】如何在 DDD 中使用 EF DbContext 分离我的聚合【英文标题】:How to separate my Aggregates by using EF DbContext in DDD 【发布时间】:2022-01-01 03:29:05 【问题描述】:

我有 5 个域,我需要将每个域与不同的数据库分开,那么如何使用 Entity Framework 进行分离。

【问题讨论】:

【参考方案1】:

领域驱动设计对您的持久性机制没有意见,例如您如何设计或构建一个或多个数据库。所以从 DDD 的角度来看,答案是“随你喜欢”!

但是,如果您希望想要将您的域分隔到不同的数据库中(即使您不必这样做),您的选择是:

    将所有域中的所有内容保存在一个 DbContext 中,并将接口传递到您的类中,以便仅访问特定域类,例如从 DbContext 访问订单的 IOrdersRepository,以及仅访问来自同一 DbContext 的发票的 IInvoicesRepository。 为每个域向您的应用添加多个 DbContext,例如 SalesDbContext、BillingDbContext、MarketingDbContext,并在 Startup.cs 文件中为每个 DbContext 提供自己的连接字符串。 将您的应用拆分为更小的项目(如微服务),例如具有自己的 DbContext 的 Sales.Api 和具有自己的 DbContext 的 Billing.Api。

可能还有其他我没有想到的选项,因为 DDD 并没有规定您如何存储数据。

【讨论】:

2.为每个应用程序添加多个 DbContext,我会执行类似 public class AdministrationDbContext : DbContext... public class AccountingDbContext: DbContext... 等的操作,但现在当我尝试将每个 DbContext 迁移到数据库时,它会在每个数据库中构建所有聚合。 如果我对您的理解正确,我认为您的域之间的耦合过于紧密。我猜你在每个上下文中的模型在另一个上下文中引用模型,所以 EFCore 正在构建一个大型关系数据库,其中包含许多表,外键引用其他表......这就是你的意思吗?如果您愿意,您实际上可以构建这样的应用程序。但是,如果您决定分离您的域,那么您需要将这些上下文相互分离。 我喜欢听/读 Derek Comartin。他谈了很多关于在 DDD 中寻找边界以及分离域和有界上下文的内容。也许这个视频或他的其他视频会对你有所帮助:youtube.com/watch?v=dnhshUdRW70&t=2074s 超级有用,谢谢。

以上是关于如何在 DDD 中使用 EF DbContext 分离我的聚合的主要内容,如果未能解决你的问题,请参考以下文章

在 DDD 中公开 ASP.NET 身份服务

如何使用 caliburn micro 在 Wpf 中注入 EF DbContext

如何在 EF 中的 DbContext 上使用 Find 或 Find<T>?

EF 代码优先:如何在遵循 DDD 时从实体的集合中删除一行?

如何从 EF7 DbContext 获取 ConnectionString

EF4 DbContext:如何集中审核数据库读取