2017-01-31 16 views
1

Один аспект AggregateRoots с детьми не на 100% ясен для меня. И я также не нашел полного примера через Google.AggregateRoot и дети

Предположим, у меня есть «Агрегат» «Клиент». Клиент может иметь многопроектные проекты.

Я уже узнал, что у меня есть только один «покупатель» AggregateRoot, а проект - не корень, настолько хороший.

public class Customer : AggregateRoot 
{ 
    private List<Project> _projects { get;set; } 

    public void AddProject(Guid id, string name, int budget) 
    { 
     ? 
    } 
} 

У меня есть несколько небольших вопросов.

  1. Является ли проект агрегатом (просто без корня) или просто классом POCO?
    • Важное значение для применения состояния и то, что для сохранения в хранилище событий
  2. Я имею бизнес-правило, проецирует на каждый клиент иметь уникальное имя.
    • Где это бизнес-правило, внутри Клиента или внутри Проекта?
  3. ли моя команда имеет название «AddProject» и существует в пространстве имен клиента или «CreateProject» и существует в пространстве имен проекта, который затем загружает агрегат клиента в фоновом режиме и выполняет «AddProject» на агрегате клиента?

Сердечные приветы

ответ

0

Агрегатная корень не должен содержать другой совокупный корень. Таким образом, Project должен быть просто сущностью, в которой используется совокупный корень клиента. Что касается правила, очевидно, я бы разместил его на уровне Project, потому что для проверки этого правила вам нужно будет иметь доступ к другим проектам внутри одного клиента, которые не должны быть ответственными за объект Project, поскольку он не должен «знать» о том, как он хранится или ссылается на другие объекты.

+0

Спасибо за ваш ответ. Я думаю, вы имеете в виду ваше третье предложение «на уровне клиента», правильно? И я добавляю третий вопрос на мой пост, может быть, вы тоже можете поделиться своим мнением с этим? – SharpNoiZy

+0

Да, извините, я имел в виду уровень клиента. Что касается команд, это зависит от семантики, уровень которой должен присутствовать в этой команде, но определенно не на уровне Проекта, так как снова обе команды допускают модификацию некоторого состояния, которое ссылается на Project, но в то же время Project не должен знать о структуре штата или даже его существование. –

2

Является ли проект агрегатом (просто без корня) или просто классом POCO?

Ну, это похоже на сущность, поскольку вы передаете идентификатор при его добавлении.

У меня есть бизнес-правило, согласно которому проекты на одного клиента имеют уникальное имя. Где это бизнес-правило, внутри Клиента или внутри Проекта?

Совокупный существует для обеспечения согласованности и инвариантов внутри него, поэтому понятие уникальности каждого клиента имеет жить внутри Customer. Когда кто-то пытается добавить Project в Customer, эти правила должны быть соблюдены, и только Customer знает, какие у него другие проекты.

ли моя команда имеет название «AddProject» и существует в пространстве имен клиентов или «CreateProject» и существует в пространстве имен проекта

То же, что и выше - эта логика должна жить внутри Customer в чтобы обеспечить соблюдение бизнес-правила уникальности для названий проектов.

1

Является ли проект агрегатом (просто без корня) или просто классом POCO?

Это как Объект и POCO. POCO просто означает, что ваш класс является голым металлом C# и не испорчен доступом к данным или инфраструктурной библиотекой. Совокупные корни также являются POCOs.

Project не является AR, поскольку он уже живет под заказчиком AR.

У меня есть бизнес-правило, согласно которому проекты на одного клиента имеют уникальное имя. Где это бизнес-правило, внутри Клиента или внутри проекта ?

«На клиента» четко указывает на универсальный инвариант, поэтому он касается агрегата Customer. В этом случае агрегированные инварианты применяются Агрегатным корневым классом Customer.

ли моя команда имеет название «AddProject» и существует в пространстве имен клиентов или «CreateProject» и существует в пространстве имен проекта, который затем загружает агрегат клиента в фоновом режиме и выполняет «AddProject» на клиентский агрегат

Во-первых, не путайте пространства имен с дизайном модели домена. Пространство имен действительно не вступает в игру при определении того, какой доменный объект имеет какой метод. На самом деле распространено видеть целые уровни домена с одним пространством имен .

Пространства имен являются более или менее размытым отражением организации вашего кода, не самой организацией.

Это сказанное, я видел реализаций, где команды были либо

  • в слое домена

или

  • в прикладном.

Кроме того, поскольку Команды являются агрегатами, может иметь смысл добавить пространство под-имен для каждого агрегата.

В частности, это будет означать что-то вроде

YourApplication.Application.Commands[.Customer].AddProject

или

YourApplication.Domain.Commands[.Customer].AddProject

+0

Спасибо за ваш длинный ответ! Ваше пространство имен предложение принято в дальнейшем будет означать для запросов: YourApplication.Domain.Queries [.project] .GetProjectByName Или также YourApplication.Domain.Queries [.Customer] .GetProjectByName – SharpNoiZy

+0

Нет, пространство имен для запросов не должны иметь ничего делать с доменом вообще. Сегрегация ответственности запроса запроса. Это суть CQRS. У меня есть сообщение в блоге с обзором типичной архитектуры CQRS. Вы можете найти его здесь (http://danielwhittaker.me/2014/10/02/cqrs-step-step-guide-flow-typical-application/) – Codescribler