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