Tag: aggregateroot

如何为分层数据结构定义DDD聚合根?

我目前正在尝试将领域驱动设计原则应用于我的开发实践。 我一直坚持如何为层次结构中组织的数据定义聚合根。 让我们以文件夹结构为例 – 每个文件夹可以有0..N子文件夹,子文件夹0..N也可以有0..N子文件夹,依此类推。 我在一个文件夹上有不变量,所有它的直接和间接子文件夹 – 删除文件夹应该导致删除它的所有子文件夹 那将是DDD有效方法让我们说聚合根“文件夹层次结构”,它包含1个“文件夹”实体(即该文件夹层次结构的“标题”文件夹),每个文件夹实体具有0..N文件夹实体(sub -folders) 那是一个有效的DDD吗? 这会有效吗? 由于我已经读过DDD主张拥有小聚合,但是这个“文件夹层次结构”可能是一个巨大的聚合… 具有深层次结构的聚合根是否适合DDD? Vaughn Vernon的有效集合设计 任何建议如何使这两个DDD有效和有效? 编辑 让我们有一个具有树状结构的对象的不同示例。 假设我需要开发一个任务跟踪系统,并且该系统需要任务使子任务具有非固定级别 – 所有任务都是从function/行为角度来看 – 每个任务可以有0..1父任务和0。 .N儿童任务。 将Task作为聚合根(具有所有它的子任务层次结构)不会遵循DDD建议的小聚合 – 对吗? 根据DDD原则, Task的优秀设计是什么? 如果Task (带有它的层次结构)不是aggegate,如何在Task上实现不变量(包含所有它的子任务层次结构)?

使用域驱动设计与entity framework聚合根

我正在使用使用Entity Framework的Domain Driven Design构建应用程序。 我的目标是允许我的域模型(通过EF持久化)包含一些逻辑。 开箱即用,entity framework对于如何将实体添加到图形然后保持不变非常不受限制。 举例来说,我的域名为POCO(没有逻辑): public class Organization { private ICollection _people = new List(); public int ID { get; set; } public string CompanyName { get; set; } public virtual ICollection People { get { return _people; } protected set { _people = value; } } } public class Person { […]

DDD:持久化之前的实体身份

在域驱动设计中,实体的一个定义特征是它具有身份。 问题: 我无法在实例创建时为实体提供唯一标识。 一旦实体被持久化(此值由底层数据库提供),此标识仅由存储库提供。 此时我无法开始使用Guid值。 现有数据与int主键值一起存储,我无法在实例化时生成唯一的int。 我的解决方案 每个实体都有一个标识值 一旦持久化(由数据库提供),身份仅设置为真实身份 在持久性之前实例化时,标识设置为默认值 如果标识是默认标识,则实体可通过引用进行比较 如果标识不是默认标识,则实体可通过标识值进行比较 代码(所有实体的抽象基类): public abstract class Entity { private readonly IdType uniqueId; public IdType Id { get { return uniqueId; } } public Entity() { uniqueId = default(IdType); } public Entity(IdType id) { if (object.Equals(id, default(IdType))) { throw new ArgumentException(“The Id of a Domain Model […]