Domain driven design 我必须将聚合子级公开为公共属性才能实现持久性吗?

Domain driven design 我必须将聚合子级公开为公共属性才能实现持久性吗?,domain-driven-design,Domain Driven Design,我很高兴最近找到了这个网站,从这里我学到了很多东西。 我来自中国,我的英语不太好。但我会尽力表达我想说的话 最近,我开始学习领域驱动设计,我对此非常感兴趣。我计划用DDD开发一个论坛网站 在阅读了这里的大量文章后,我明白了坚持无知是一种很好的做法 目前,我有两个问题,关于我长期以来的想法 域对象是否应该与存储库交互以获取/保存数据 如果域对象不使用存储库,那么基础结构层(如工作单元)如何知道哪个域对象是新的/修改的/删除的 关于第二个问题。下面是一个示例代码: 假设我有一个用户类: public

我很高兴最近找到了这个网站,从这里我学到了很多东西。
我来自中国,我的英语不太好。但我会尽力表达我想说的话

最近,我开始学习领域驱动设计,我对此非常感兴趣。我计划用DDD开发一个论坛网站

在阅读了这里的大量文章后,我明白了坚持无知是一种很好的做法

目前,我有两个问题,关于我长期以来的想法

  • 域对象是否应该与存储库交互以获取/保存数据
  • 如果域对象不使用存储库,那么基础结构层(如工作单元)如何知道哪个域对象是新的/修改的/删除的
  • 关于第二个问题。下面是一个示例代码: 假设我有一个用户类:

    public class User
    {
     public Guid Id { get; set; }
     public string UserName { get; set; }
     public string NickName { get; set; }
    
     /// <summary>
     /// A Roles collection which represents the current user's owned roles.
     /// But here i don't want to use the public property to expose it.
     /// Instead, i use the below methods to implement.
     /// </summary>
     //public IList<Role> Roles { get; set; }
    
     private List<Role> roles = new List<Role>();
     public IList<Role> GetRoles()
     {
        return roles;
     }
     public void AddRole(Role role)
     {
        roles.Add(role);
     }
     public void RemoveRole(Role role)
     {
        roles.Remove(role);
     }
    }
    
    在这种情况下,我不知道存储库或工作单元如何知道用户有一个新角色

    我认为,一个真正的持久化框架应该支持POCO,如果POCO本身发生任何变化,持久化框架应该自动知道。即使像上面的例子一样,通过方法(AddRole、RemoveOLE)更改对象状态

    我知道如果我使用Roles属性,很多ORM可以自动持久化更改,但有时我不喜欢这种方式,因为性能原因

    有人能给我一些建议吗?谢谢

    这是我在这个网站上的第一个问题。我希望我的英语能被理解。
    任何答案都将不胜感激

    域对象是否应该与存储库交互以获取/保存数据

    不,不应该。原因很简单——封装。如果我们从域模型中去掉所有与持久性相关的东西,我们可以更清楚地描述我们的域

    如果域对象不使用存储库,那么基础结构层(如工作单元)如何知道哪个域对象是新的/修改的/删除的

    最简单的版本是-它不是。检索并将其作为一个整体保存(在聚合操作完成后):

    var user = users.Find(guid);
    user.AssignRole(Role.Administrator);
    users.Save(user);
    
    我个人依赖于NHibernate,它自己跟踪变化。如果我使用适当的急/缓加载优化查询,只在http请求端保存更改,不要忘记事务,使用缓存-没有性能损失。但要付出代价——这需要一些知识来处理

    还有一件事-在使用域驱动设计开发论坛之前,请三思。此方法仅适用于未知(尚未)和复杂的业务领域。对于简单的应用程序来说,这是一种过度的杀伤力

    还有一件事——不要为你的英语感到羞耻。情况很快就会好转。:)

    域对象是否应该与存储库交互以获取/保存数据

    不,不应该。原因很简单——封装。如果我们从域模型中去掉所有与持久性相关的东西,我们可以更清楚地描述我们的域

    如果域对象不使用存储库,那么基础结构层(如工作单元)如何知道哪个域对象是新的/修改的/删除的

    最简单的版本是-它不是。检索并将其作为一个整体保存(在聚合操作完成后):

    var user = users.Find(guid);
    user.AssignRole(Role.Administrator);
    users.Save(user);
    
    我个人依赖于NHibernate,它自己跟踪变化。如果我使用适当的急/缓加载优化查询,只在http请求端保存更改,不要忘记事务,使用缓存-没有性能损失。但要付出代价——这需要一些知识来处理

    还有一件事-在使用域驱动设计开发论坛之前,请三思。此方法仅适用于未知(尚未)和复杂的业务领域。对于简单的应用程序来说,这是一种过度的杀伤力

    还有一件事——不要为你的英语感到羞耻。情况很快就会好转。:)