聚合根,他们应该负责删除子对象吗?

Joh*_*ohn 3 domain-driven-design ddd-repositories aggregateroot

关于聚合根,我有一个问题,他们是否应该负责删除子对象,还是应该归到存储库?如果我想通过其Id查询一个文件,我应该在我的存储库中为此创建一个特定方法,该怎么办?

我的聚合根的代码片段:

public class Folder {

   #region Properties

   public Guid Id { get;set; }
   public Name { get;set; }
   public virtual ICollection<File> Files { get;set; }

   #endregion

   #region Methods

   public File AddFile(string type, string title, bool share = false)
   {
     ///
   }

   #endregion
}
Run Code Online (Sandbox Code Playgroud)

文件类:

public class File
{
    #region Properties

    public virtual Folder Folder { get; set; }
    public string Title { get; set; }
    public string Type { get; set; }
    public bool Shared { get; set; }

    #endregion

    #region Constructor

    public File(Folder folder, string type, string title, bool share = false)
    {
        ///
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Gia*_*sio 6

聚合根负责域不变量(请参阅http://dddcommunity.org/library/vernon_2011/).

所以答案是肯定的,聚合根应该是唯一可以访问它聚合的对象的对象.这意味着没有其他对象应该获取对File的引用,并且该File不应该公开任何更改其自身状态的方法.

所有更改子对象状态的方法都应该由聚合根本身公开,因为它必须确保聚合不变量.

至于持久删除,我通常将域事件建模为.NET事件:在返回实体之前,这些事件由存储库订阅.因此,在事件处理程序中会出现持久性逻辑(有关详细信息,请参阅http://epic.tesio.it/doc/manual/observable_entities.html)