Search code examples
domain-driven-designentitiesaggregateroot

What is the Aggregate root in this case


I have these entities

  • User
  • Task - every task must have a user assigned
  • Project - a task can be assigned to a project but it's not necessary, user must be assigned as a project creator
  • TaskStatus - every task must have a status assigned

and I designed the aggregate roots as follows

Aggregate roots

  • User with entities:Task, Task status
  • Project

Am I going in right direction ?


Solution

  • Yeah, sounds quite right. This is my improvisation in 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);
    

    Keep in mind - that's just a sketch. Don't take it too seriously.