预定义的 MVC ApplicationDbContext 是否应该移动到不同的层、域或存储?
Should the pre-defined MVC ApplicationDbContext be moved to a different layer, domain or storage?
使用 MVC5 时,我使用依赖注入为所有业务数据添加域层和存储层。但是我一直把ApplicationDbContext留在主MVC应用层项目中。
我阅读了很多关于 SO 的帖子,看到很多人建议将 ApplicationDbContext 移出 MVC 项目。我想了解为什么应该或不应该移动 ApplicationDbContext。是否有任何理由不移动此上下文?
一方面,ApplicationDbContext 使用的数据模型建议将其移至存储层,但这将需要大型 DTO。另一方面,ApplicationDbContext 实际上主要与应用程序访问相关,而且我有一个单独的 roles/permissions 业务数据功能。一些 SO 帖子还建议检查应用层中的角色,而不是领域层,但这似乎很可疑;我们不想检查域层中的业务角色吗?
所以我很困惑,在我开始将 ApplicationDbContext 移动到另一个层之前,我想确保我做出了一个合理且明智的决定。
这不是必须的,但如果您正在做 DDD 并且您的项目往往会变大,那么建议这样做。
虽然 DDD 与实现细节无关,但 DDD 要求明确的关注点分离。那么你应该将域逻辑与基础设施分开。
您可以通过多种方式实现这种分离。一种方法是拥有一个包含域、应用程序和基础结构文件夹的项目,并将您的 DbContext 驻留在基础结构文件夹中。这适用于小型项目。
但是,在大型项目中,我建议您评估 Clean Architecture,它将把这种分离带到项目级别。
I'd like to understand why ApplicationDbContext should or should not be moved. Are there any reasons to not move this context?
它可以移动,没有规则禁止它。但是该工具随后会要求您将启动项目和数据库项目都指定为参数,如下所示:
dotnet ef database update --project <path> --startup-project <path>
但是由于您使用的是 MVC5,因此您可能没有使用 EF Core。如果是 EF 6 或更低版本,您将使用包管理器控制台 (PMC) 来管理迁移和数据库更新,这将使您在这方面的生活更轻松,因为您可以将 MVC 项目标记为启动项目上下文菜单,select PMC 下拉控件中的目标项目。
Several SO posts also suggested checking roles in the application layer, not the domain layer, but that seems suspect; don't we want to check business roles in the domain layer?
是的,角色与权限相关,是业务规则。人们可能建议在应用程序层进行检查,因为您需要从数据库中提取这些数据,但您可以这样做:
使用规范模式将角色和权限表示为域层中的规范。但 IRepository 接口最好在应用层定义,因为它们代表基础设施(将在基础设施层具体实现)。因此,您将通过使用存储库检索数据来在应用程序层中启动角色检查,但实际的权限验证将由领域层中的规范完成。
这是一种方法。
使用 MVC5 时,我使用依赖注入为所有业务数据添加域层和存储层。但是我一直把ApplicationDbContext留在主MVC应用层项目中。
我阅读了很多关于 SO 的帖子,看到很多人建议将 ApplicationDbContext 移出 MVC 项目。我想了解为什么应该或不应该移动 ApplicationDbContext。是否有任何理由不移动此上下文?
一方面,ApplicationDbContext 使用的数据模型建议将其移至存储层,但这将需要大型 DTO。另一方面,ApplicationDbContext 实际上主要与应用程序访问相关,而且我有一个单独的 roles/permissions 业务数据功能。一些 SO 帖子还建议检查应用层中的角色,而不是领域层,但这似乎很可疑;我们不想检查域层中的业务角色吗?
所以我很困惑,在我开始将 ApplicationDbContext 移动到另一个层之前,我想确保我做出了一个合理且明智的决定。
这不是必须的,但如果您正在做 DDD 并且您的项目往往会变大,那么建议这样做。
虽然 DDD 与实现细节无关,但 DDD 要求明确的关注点分离。那么你应该将域逻辑与基础设施分开。
您可以通过多种方式实现这种分离。一种方法是拥有一个包含域、应用程序和基础结构文件夹的项目,并将您的 DbContext 驻留在基础结构文件夹中。这适用于小型项目。
但是,在大型项目中,我建议您评估 Clean Architecture,它将把这种分离带到项目级别。
I'd like to understand why ApplicationDbContext should or should not be moved. Are there any reasons to not move this context?
它可以移动,没有规则禁止它。但是该工具随后会要求您将启动项目和数据库项目都指定为参数,如下所示:
dotnet ef database update --project <path> --startup-project <path>
但是由于您使用的是 MVC5,因此您可能没有使用 EF Core。如果是 EF 6 或更低版本,您将使用包管理器控制台 (PMC) 来管理迁移和数据库更新,这将使您在这方面的生活更轻松,因为您可以将 MVC 项目标记为启动项目上下文菜单,select PMC 下拉控件中的目标项目。
Several SO posts also suggested checking roles in the application layer, not the domain layer, but that seems suspect; don't we want to check business roles in the domain layer?
是的,角色与权限相关,是业务规则。人们可能建议在应用程序层进行检查,因为您需要从数据库中提取这些数据,但您可以这样做:
使用规范模式将角色和权限表示为域层中的规范。但 IRepository 接口最好在应用层定义,因为它们代表基础设施(将在基础设施层具体实现)。因此,您将通过使用存储库检索数据来在应用程序层中启动角色检查,但实际的权限验证将由领域层中的规范完成。
这是一种方法。