Что такое Совокупный корень в этом случае - PullRequest
3 голосов
/ 20 января 2011

У меня есть эти объекты

  • Пользователь
  • Задача - каждой задаче должен быть назначен пользователь
  • Проект - задача может быть назначена проекту, но онанеобязательно, пользователь должен быть назначен создателем проекта
  • TaskStatus - каждой задаче должен быть присвоен статус

, и я спроектировал агрегатные корни следующим образом

Aggregateкорни

  • Пользователь с сущностями: Задача, Состояние задачи
  • Проект

Я иду в правильном направлении?

1 Ответ

1 голос
/ 23 января 2011

Да, звучит совершенно верно. Это моя импровизация в с #:

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

Имейте в виду - это всего лишь эскиз. Не воспринимай это слишком серьезно.

...