Domain driven design 在这种情况下,聚合根是什么

Domain driven design 在这种情况下,聚合根是什么,domain-driven-design,entities,aggregateroot,Domain Driven Design,Entities,Aggregateroot,我有这些实体 使用者 任务-每个任务都必须分配一个用户 项目-任务可以分配给项目,但不是必需的,用户必须被分配为项目创建者 TaskStatus-每个任务都必须分配一个状态 我设计了聚合根,如下所示 聚合根 具有实体的用户:任务、任务状态 计划 我走的方向对吗?是的,听起来很对。这是我在c#中的即兴创作: 记住,那只是一个草图。不要太认真。任务不需要分配给项目,但必须由用户创建。因此,我选择用户作为任务实体的AR,因为任务不能没有用户,但可以没有项目。我在这儿吗?到目前为止听起来还算合理

我有这些实体

  • 使用者
  • 任务-每个任务都必须分配一个用户
  • 项目-任务可以分配给项目,但不是必需的,用户必须被分配为项目创建者
  • TaskStatus-每个任务都必须分配一个状态
我设计了聚合根,如下所示

聚合根

  • 具有实体的用户:任务、任务状态
  • 计划

我走的方向对吗?

是的,听起来很对。这是我在c#中的即兴创作:


记住,那只是一个草图。不要太认真。

任务不需要分配给项目,但必须由用户创建。因此,我选择用户作为任务实体的AR,因为任务不能没有用户,但可以没有项目。我在这儿吗?到目前为止听起来还算合理。但是,再一次,出现了其他需要头脑风暴的问题。例如,可能-项目有成员,如果任务是特定于项目的,则仅当成员被分配到项目时,该任务才应可注册。我认为一个AR可以引用另一个AR?它可能是项目的不变量。只有分配了用户,才能创建项目。是的,可以从另一个用户引用AR。
//aggregate root
public class User{/*first name, last name, contacts, etc.*/}

//aggregate root
public class Project{
  public IList Tasks{get; private set;}
  public User CreatedBy{get; private set;}
  public Project(User createdBy){
    CreatedBy=createdBy;
  }
  public RegisterTask(string taskDescription, User assignedTo){
    Tasks.Add(new Task(taskDescription, assignedTo));
  }
  public StartWorkOn(Task task){
    if(!Tasks.Contains(task))
      throw new Exception("Task is not registered");
    task.StartWork();
  }
}

//entity
public class Task{
  public User AssignedTo{get;private set;}
  public string Description{get; private set;}
  public TaskStatus Status{get; private set;}
  internal Task(string description, User assignedTo){
    AssignedTo=assignedTo;
    Description=description;
    Status=TaskStatus.Pending;
  }
  internal void StartWork(){
    if(Status!=TaskStatus.Pending)
      throw new Exception("Can't start what's ongoing");
    Status=TaskStatus.InProgress;
  }
  internal void Finish(){
    if(Status!=TaskStatus.InProgress)
      throw new Exception("Can't finish what has not started");
    Status=TaskStatus.Finished;
  }      
}

//value object
public enum TaskStatus{ Pending, InProgress, Finished }

var me=new User();
_users.Save(me);

var you=new User();
_users.Save(you);

var project=new Project(me);
project.RegisterTask("Have a nice day!", you);
project.StartWorkOn(project.Tasks.First());
_projects.Save(project);