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)
谢谢
聚合根负责域不变量(请参阅http://dddcommunity.org/library/vernon_2011/).
所以答案是肯定的,聚合根应该是唯一可以访问它聚合的对象的对象.这意味着没有其他对象应该获取对File的引用,并且该File不应该公开任何更改其自身状态的方法.
所有更改子对象状态的方法都应该由聚合根本身公开,因为它必须确保聚合不变量.
至于持久删除,我通常将域事件建模为.NET事件:在返回实体之前,这些事件由存储库订阅.因此,在事件处理程序中会出现持久性逻辑(有关详细信息,请参阅http://epic.tesio.it/doc/manual/observable_entities.html)