Domain driven design 存储库模式和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

目前,我为每个数据库表创建了一个存储库,并为列值(传递数据的对象)创建了相应的数据类

我最近开始使用一些1对1关系,我不确定什么是实现它们的最佳方式

例如

如果我有一个1:1关系的用户表和用户设置表

// 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; }       
        } 
问题:

  • 我应该始终通过User对象来操作UserSettings对象,还是应该能够操作它们 独立的
  • 我应该在UserSettings对象中包含主键字段吗
  • 我应该在User对象中存储对USerSettings对象的引用吗

  • 我是否制作了两个repo,一个用于用户,一个用于用户设置,还是处理用户repo中的所有内容

  • 你所说的“通过用户对象”到底是什么意思
  • 伊姆霍,不
  • 你可以,但我认为你不应该。你有什么理由想知道这些设置属于哪个用户吗?你唯一想知道的时候——imho——就是你坚持的时候。在数据库中,您需要知道UserSettings属于哪个用户。在你的模型中,我认为你可以通过单向关系来满足
  • 您应该只为每个聚合根创建一个存储库,在您的情况下,“用户”可以是聚合根。UserSettings-imho-甚至不是一个实体,而是一个值对象
  • 你所说的“通过用户对象”到底是什么意思
  • 伊姆霍,不
  • 你可以,但我认为你不应该。你有什么理由想知道这些设置属于哪个用户吗?你唯一想知道的时候——imho——就是你坚持的时候。在数据库中,您需要知道UserSettings属于哪个用户。在你的模型中,我认为你可以通过单向关系来满足
  • 您应该只为每个聚合根创建一个存储库,在您的情况下,“用户”可以是聚合根。UserSettings-imho-甚至不是一个实体,而是一个值对象

  • 我唯一一次发现聚合根之间的1:1关系是有用的,那就是当关系两侧的聚合根由不同的域管理时。它们必须共享相同的主键,因此,如果它们都由相同的域管理,则根据定义它们是相同聚合根的一部分。我认为你需要从另一个角度来看待这个问题:

  • 用户
    对象是否只存在于该应用程序中
  • 你认为情况会一直如此吗
  • 如果
    用户
    是一个完全位于此域内的概念,则没有理由拥有与
    用户
    具有1:1关系的
    用户设置
    聚合根;您只需将
    User.Settings
    作为一种检索该
    用户的
    UserSettings
    的方法。(当然,这消除了对存储库的需要-当
    用户上的所有其他内容都进行水合物化时,
    用户存储库
    负责水合物化
    用户设置

    但是,如果
    用户
    最终将通知多个域的会话,则
    用户
    需要表示自己的域,即应用程序将使用的服务。然后,您真正需要将此应用程序的
    UserSettings
    与其他应用程序的设置分开。
    用户
    不是此应用程序特有的,但该
    用户的
    用户设置


    注意-为了避免此时重构您的项目,如果以上问题1或问题2的答案为“否”,则您应该在同一个域中使
    用户设置
    成为单独的聚合根,为了在您最终将
    用户
    移动到其自己的域时创建无缝转换。

    我唯一一次发现聚合根之间的1:1关系有用的是,当关系两侧的聚合根由不同域管理时。它们必须共享相同的主键,因此,如果它们都由相同的域管理,则根据定义它们是相同聚合根的一部分。我认为你需要从另一个角度来看待这个问题:

  • 用户
    对象是否只存在于该应用程序中
  • 你认为情况会一直如此吗
  • 如果
    用户
    是一个完全位于此域内的概念,则没有理由拥有与
    用户
    具有1:1关系的
    用户设置
    聚合根;您只需将
    User.Settings
    作为一种检索该
    用户的
    UserSettings
    的方法。(当然,这消除了对存储库的需要-当
    用户上的所有其他内容都进行水合物化时,
    用户存储库
    负责水合物化
    用户设置

    但是,如果
    用户
    最终将通知多个域的会话,则
    用户
    需要表示自己的域,即应用程序将使用的服务。然后,您真正需要将此应用程序的
    UserSettings
    与其他应用程序的设置分开。
    用户
    不是此应用程序特有的,但该
    用户的
    用户设置

    注意-为了避免此时重构您的项目,如果以上问题1或2的答案为“否”,则您应