在洋葱架构的基础设施层中放置 Entity Framework 个模型

Placing Entity Framework models in the infrastructure layer in onion architecture

我正在使用 .NET Core 5 中的 DDD 和 Onion 架构构建一个 Web 应用程序。

共有4层:

  1. 领域层 - 包含领域模型
  2. 应用层 - 具有核心业务逻辑并引用领域层
  3. 基础结构层 - 使用 EF Core 检索数据并将数据保存到 Azure SQL,它指的是应用程序层
  4. API 层 - 具有控制器并指的是应用程序和基础设施层

通过API层引用基础设施层只是为了连接到数据库,任何对数据库的请求都将通过应用层;应用层具有在基础结构层中实现的接口,用于从数据库中保存和检索数据。

现在,当我使用代码优先或数据库优先方法创建数据库时,这些 EF 模型 类 应该放在哪里?

将它们放在领域层会破坏洋葱架构,因为领域层不应该知道基础设施层的任何信息。

  1. 在域层中放置模型和映射

我见过几个示例,其中模型和映射放置在领域模型中,并且这些映射用于基础架构层 OnModelCreating(..),但领域中仍然存在特定于数据库的基础架构层映射层。如果我想用其他数据库替换基础架构层怎么办,在这种情况下我需要更改对我来说似乎不正确的域模型..

  1. 将模型置于基础设施层

我可以将 EF 模型 类 放在基础设施层,但我如何在应用层引用它们?我是否需要为每个模型存储库提供一个接口,或者是否有针对同一接口的多个依赖注入?

我希望领域模型由业务模型持有,并将 EF 模型放在基础架构层中,并在必要时使用 AutoMapper 在它们之间进行映射。

那么保存 EF 模型的最佳实践是什么,这样它就不会破坏 Onion 架构。

好吧,您可以让您的基础架构层从 EF 核心检索数据并将其映射到您的领域层,您必须为每个将 return 领域模型的存储库提供一个接口。至于同一接口的不同实现,您总是可以构建某种类型的工厂来处理它。 类似 的答案。

如果您使用的是 EF Core,我认为不需要单独的 EF 模型

我通常做的是在领域层实现领域模型classes,它支持我的方式业务逻辑最好。然后在 基础结构层 中放置 entity framework 配置 classes 使用 IEntityTypeConfiguration 与泛型。

这正是被认为是为了保持领域模型 classes 免于基础设施问题而使用的方式,这样即使您更改数据库实现,领域模型也永远不必更改.

您可以在由 Microsoft 提供支持的 EShopOnContainers 参考项目中查看工作示例 here

例如,EF Core 的 Order aggregate is defined in the domain layer whereas the corresponding model configuration class 位于基础设施层。

然后在基础设施层的 API project startup and the corresponding DbContext (OrderingContext) class 中一切都像往常一样连接起来。

基础设施层将依赖于来自领域层的领域实体,而不是你想要在洋葱架构中实现的相反方式。