netcorepal / netcorepal-cloud-framework

基于 ASP.NET Core 的领域驱动设计微服务架构实现方案
https://netcorepal.github.io/netcorepal-cloud-framework/
MIT License
124 stars 36 forks source link

对于需要复合主键的聚合根怎么处理呢? #8

Closed yc-2503 closed 7 months ago

yc-2503 commented 9 months ago

我现在一个场景是类似于多租户,比如用户ID在本租户下是禁止重复的,但是在其他租户中是允许重复的。 因为有些场景,库存的物料需要在不同租户直接流转,所以不同的租户,实际是在同一张业务表中。 我现在的处理办法是,单独定义一个没有任何业务含义的主键,然后租户与用户名声明为唯一约束。 但是这样会有一个麻烦,比如我新增一个用户之前,要先检查用户ID是否已经存在,如果用户ID是主键,我只需要依赖UserRepository, 但是因为现在实际的主键是一个没有业务含义的字段,所以,我需要依赖UserQuery 先查询当前用户是否存在,之后再通过UserRepository存入数据库。

witskeeper commented 9 months ago

核心的问题是用户ID在本租户下是禁止重复的,但是在其他租户中是允许重复的,这个问题我之前也遇到过,以我的经验,最好的做法是用户ID全局不重复,要么修改原用户ID确保不重复,要么如你所做,定义一个新的字段作为ID,替换原有的ID, 最终达到用户ID全局不重复这个状态。 任何想从其它期望绕开这个点来解决问题的方法,大概率都会得不偿失。

yc-2503 commented 9 months ago

核心的问题是用户ID在本租户下是禁止重复的,但是在其他租户中是允许重复的,这个问题我之前也遇到过,以我的经验,最好的做法是用户ID全局不重复,要么修改原用户ID确保不重复,要么如你所做,定义一个新的字段作为ID,替换原有的ID, 最终达到用户ID全局不重复这个状态。 任何想从其它期望绕开这个点来解决问题的方法,大概率都会得不偿失。

那在这个项目里,租户是怎么规划的呢?

witskeeper commented 9 months ago

在这个项目里,首先使用了全局雪花ID,因此任何实体的ID都是全局唯一的,不会出现ID重复问题。 关于租户模式的实现,有几个关键点可以考虑:

  1. 基于上下文传递能力,定义租户上下文,在系统间传递;
  2. 基于EntityFrameworkCore的过滤器能力+租户上下文,实现数据层租户隔离
  3. 基于DbContextFactory实现多数据库隔离租户能力(可选)