Domain driven design 存储库模式和1:1关系
目前,我为每个数据库表创建了一个存储库,并为列值(传递数据的对象)创建了相应的数据类 我最近开始使用一些1对1关系,我不确定什么是实现它们的最佳方式 例如 如果我有一个1:1关系的用户表和用户设置表Domain driven design 存储库模式和1:1关系,domain-driven-design,repository,Domain Driven Design,Repository,目前,我为每个数据库表创建了一个存储库,并为列值(传递数据的对象)创建了相应的数据类 我最近开始使用一些1对1关系,我不确定什么是实现它们的最佳方式 例如 如果我有一个1:1关系的用户表和用户设置表 // Data classes (Holds all the field value for the table) public class User { public int UserId { get; set; } public string Na
// Data classes (Holds all the field value for the table)
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
}
public class UserSettings
{
public int UserId { get; set; }
public bool SomeSetting { get; set; }
}
问题:
我唯一一次发现聚合根之间的1:1关系是有用的,那就是当关系两侧的聚合根由不同的域管理时。它们必须共享相同的主键,因此,如果它们都由相同的域管理,则根据定义它们是相同聚合根的一部分。我认为你需要从另一个角度来看待这个问题:
用户
对象是否只存在于该应用程序中用户
是一个完全位于此域内的概念,则没有理由拥有与用户
具有1:1关系的用户设置
聚合根;您只需将User.Settings
作为一种检索该用户的UserSettings
的方法。(当然,这消除了对存储库的需要-当用户上的所有其他内容都进行水合物化时,用户存储库
负责水合物化用户设置
)
但是,如果用户
最终将通知多个域的会话,则用户
需要表示自己的域,即应用程序将使用的服务。然后,您真正需要将此应用程序的UserSettings
与其他应用程序的设置分开。用户
不是此应用程序特有的,但该用户的用户设置
是
注意-为了避免此时重构您的项目,如果以上问题1或问题2的答案为“否”,则您应该在同一个域中使用户设置
成为单独的聚合根,为了在您最终将用户
移动到其自己的域时创建无缝转换。我唯一一次发现聚合根之间的1:1关系有用的是,当关系两侧的聚合根由不同域管理时。它们必须共享相同的主键,因此,如果它们都由相同的域管理,则根据定义它们是相同聚合根的一部分。我认为你需要从另一个角度来看待这个问题:
用户
对象是否只存在于该应用程序中
你认为情况会一直如此吗
如果用户
是一个完全位于此域内的概念,则没有理由拥有与用户
具有1:1关系的用户设置
聚合根;您只需将User.Settings
作为一种检索该用户的UserSettings
的方法。(当然,这消除了对存储库的需要-当用户上的所有其他内容都进行水合物化时,用户存储库
负责水合物化用户设置
)
但是,如果用户
最终将通知多个域的会话,则用户
需要表示自己的域,即应用程序将使用的服务。然后,您真正需要将此应用程序的UserSettings
与其他应用程序的设置分开。用户
不是此应用程序特有的,但该用户的用户设置
是
注意-为了避免此时重构您的项目,如果以上问题1或2的答案为“否”,则您应在