【问题标题】:What is the Aggregate root in this case在这种情况下,聚合根是什么
【发布时间】:2011-01-20 10:11:38
【问题描述】:

我有这些实体

  • 用户
  • 任务 - 每个任务都必须分配一个用户
  • 项目 - 可以将任务分配给项目,但这不是必需的,必须将用户分配为项目创建者
  • TaskStatus - 每个任务都必须分配一个状态

我设计的聚合根如下

聚合根

  • 具有实体的用户:任务、任务状态
  • 项目

我的方向正确吗?

【问题讨论】:

    标签: domain-driven-design entities aggregateroot


    【解决方案1】:

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

    //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);
    

    请记住 - 这只是一个草图。不要太认真。

    【讨论】:

    • 任务不需要分配给项目,但必须由用户创建。因此,我选择 User 作为任务实体的 AR,因为没有用户就不能存在任务,但没有项目就可以存在。我在吗?
    • 到目前为止听起来很合理。但话又说回来 - 还有其他问题需要集思广益。例如。可能 - 项目有成员,如果任务是特定于项目的,则只有在将成员分配给项目时才能注册。
    • 我认为一个 AR 可以参考另一个?它可能是项目的不变量。只有分配了用户才能创建项目。
    • 是的,AR可以被另一个引用。
    猜你喜欢
    • 2022-11-02
    • 2021-11-15
    • 2013-04-23
    • 1970-01-01
    • 2020-04-04
    • 2017-03-28
    • 2016-08-26
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多