使用 Clean Architecture 从 ApplicationCore 库中的实体引用 Infrastructure 库中的 ApplicationUser
Referencing ApplicationUser in the Infrastructure library from an entity in the ApplicationCore library using Clean Architecture
我正在按照 Microsoft Architecture Guide 创建 ASP.NET 核心 Web 应用程序。
该指南实现了非常简单的干净架构模式。
如果您查看使用干净架构模式的示例项目,您会看到有一个 Infrastructure/Identity 文件夹,其中包含 ApplicationUser.cs class.
我的问题:
我正在使用 Entity Framework 并且我在 ApplicationCore class 库中的一个业务实体需要包含一个 ApplicationUser 列表。 ApplicationCore 库不应引用任何其他项目。它包含所有接口和业务实体。如何在不违反规则的情况下将 ApplicationUser class 保留在我的 Infrastructure/Identity 项目中,并且仍然在我的 ApplicationCore 项目中的一个业务实体中使用它。
我知道一种解决方案是不将 ApplicationUser 实体存储在我的基础结构项目中。但是,我觉得它应该存在,因为它在实现 IdentityUser 时始终依赖于 Identity。
在干净的架构中:
应用核心类型
• 实体(持久化的业务模型 类)和聚合
• 接口
• 服务
• DTO
• 规格
• 例外情况
基础设施类型
• EF 核心类型(DbContext、迁移)
• 数据访问实现类型(存储库)
• 特定于基础架构的服务(FileLogger、SmtpNotifier 等)
所以 ApplicationUser.cs 是一个实体,它应该在 Application Core
User是一个实体,应该在Core层。
但是您不应该在核心层中使用 ApplicationUser : IdentityUser
,因为它与 ASP.NET 身份相关联。核心层应该不知道什么技术将要实现领域。
如果明天你想使用另一个图书馆进行用户管理怎么办?这不是核心层的问题。
你可以做的是在核心层使用接口或基本用户class,让基础设施层担心库选择决定。
这也是我自己的问题,似乎是基于某种观点。我最后的结论是,如果你依赖于其中指定了 DbContext 的任何包,那么你将在你的核心项目中引用这个包。
例如,我正在使用 AspCore.Identity 和 IdentityServer4,为此我有很多 DbContext,但我们现在说两个:
ConfigurationDbContext
和 IdentityDbContext
以及这两个上下文控制两个实体(只是为了让事情变得更容易)客户端(OAuth2 客户端)和 IdentityUser 所以现在我已经拥有所有这些作为基础设施但是现在我想拥有自己的核心实体 ApplicationUser 和 ApplcationClient 那么如何将它们放入我的核心而不让它们继承它们的父级以便我可以查询它们、保存它们或从任何来源检索它们。
我不知道完美的答案,但我最终将这些实体放在核心中并在我的核心中引用了 NuGet 包,这显然不遵循干净的架构角色,但我找不到更好的解决方案比那个。
我正在按照 Microsoft Architecture Guide 创建 ASP.NET 核心 Web 应用程序。
该指南实现了非常简单的干净架构模式。
如果您查看使用干净架构模式的示例项目,您会看到有一个 Infrastructure/Identity 文件夹,其中包含 ApplicationUser.cs class.
我的问题:
我正在使用 Entity Framework 并且我在 ApplicationCore class 库中的一个业务实体需要包含一个 ApplicationUser 列表。 ApplicationCore 库不应引用任何其他项目。它包含所有接口和业务实体。如何在不违反规则的情况下将 ApplicationUser class 保留在我的 Infrastructure/Identity 项目中,并且仍然在我的 ApplicationCore 项目中的一个业务实体中使用它。
我知道一种解决方案是不将 ApplicationUser 实体存储在我的基础结构项目中。但是,我觉得它应该存在,因为它在实现 IdentityUser 时始终依赖于 Identity。
在干净的架构中:
应用核心类型
• 实体(持久化的业务模型 类)和聚合
• 接口
• 服务
• DTO
• 规格
• 例外情况
基础设施类型
• EF 核心类型(DbContext、迁移)
• 数据访问实现类型(存储库)
• 特定于基础架构的服务(FileLogger、SmtpNotifier 等)
所以 ApplicationUser.cs 是一个实体,它应该在 Application Core
User是一个实体,应该在Core层。
但是您不应该在核心层中使用 ApplicationUser : IdentityUser
,因为它与 ASP.NET 身份相关联。核心层应该不知道什么技术将要实现领域。
如果明天你想使用另一个图书馆进行用户管理怎么办?这不是核心层的问题。
你可以做的是在核心层使用接口或基本用户class,让基础设施层担心库选择决定。
这也是我自己的问题,似乎是基于某种观点。我最后的结论是,如果你依赖于其中指定了 DbContext 的任何包,那么你将在你的核心项目中引用这个包。
例如,我正在使用 AspCore.Identity 和 IdentityServer4,为此我有很多 DbContext,但我们现在说两个:
ConfigurationDbContext
和 IdentityDbContext
以及这两个上下文控制两个实体(只是为了让事情变得更容易)客户端(OAuth2 客户端)和 IdentityUser 所以现在我已经拥有所有这些作为基础设施但是现在我想拥有自己的核心实体 ApplicationUser 和 ApplcationClient 那么如何将它们放入我的核心而不让它们继承它们的父级以便我可以查询它们、保存它们或从任何来源检索它们。
我不知道完美的答案,但我最终将这些实体放在核心中并在我的核心中引用了 NuGet 包,这显然不遵循干净的架构角色,但我找不到更好的解决方案比那个。