使用Clean Architecture从ApplicationCore库中的实体引用基础结构库中的ApplicationUser

时间:2018-12-07 05:16:38

标签: c# asp.net-core asp.net-core-mvc entity-framework-core clean-architecture

我正在遵循Microsoft Architecture Guide来创建ASP.NET Core Web应用程序。

该指南实现了简洁明了的架构模式。

如果您查看的示例项目使用的是干净的架构模式,您将看到有一个Infrastructure/Identity文件夹,其中包含ApplicationUser.cs类。

我的问题:
我正在使用实体框架,并且ApplicationCore类库中的我的业务实体之一需要包含ApplicationUser的列表。 ApplicationCore库不应引用任何其他项目。它包含所有接口和业务实体。如何在不违反规则的情况下将ApplicationUser类保留在我的Infrastructure / Identity项目中,并仍在ApplicationCore项目中的一个业务实体中使用它。

我知道一种解决方案是不将ApplicationUser实体存储在我的基础结构项目中。但是,我觉得它应该存在,因为它在实现IdentityUser时将始终依赖Identity。

3 个答案:

答案 0 :(得分:2)

在清洁架构中:

应用程序核心类型

•实体(持久化的业务模型类)和聚合

•接口

•服务

•DTO

•规格

•例外

基础结构类型

•EF核心类型(DbContext,迁移)

•数据访问实现类型(存储库)

•基础架构特定的服务(FileLogger,SmtpNotifier等)

所以ApplicationUser.cs是一个实体,应该在Application Core中

答案 1 :(得分:0)

用户是一个实体,应该在核心层。

但是您不应该在Core层中使用ApplicationUser : IdentityUser,因为它与ASP.NET Identity绑定在一起。核心层不应该知道将使用什么技术来实现该域。

如果明天您想使用另一个库进行用户管理怎么办?这不是核心层的问题。

您可以做的是在Core层中使用接口或基本User类,并让Infrastructure层担心库选择的决定。

答案 2 :(得分:0)

这也是我自己的问题,似乎是基于某种观点的。最后,如果您依赖于其中指定了DbContext的任何程序包,那么您将在Core项目中引用该程序包。

例如,我使用的是AspCore.Identity和IdentityServer4,为此我有很多DbContext,但是现在让我们说两个:

ConfigurationDbContextIdentityDbContext,这两个上下文控制两个实体(只是为了使事情变得更简单)客户端(OAuth2客户端)和IdentityUser现在,我已经拥有所有这些作为基础结构,但是现在想要拥有自己的核心实体ApplicationUser和ApplcationClient,那么如何在不让它们继承其父项的情况下将它们放入我的Core中,以便我可以对它们进行查询,保存它们或从任何来源检索它们。

我不确定确切的答案,但最终我将这些实体放入Core并在我的Core中引用了NuGet包,这些包显然不遵循干净的架构角色,但是我找不到比这更好的解决方案那。