Como usar el patrón agregado en este caso

Estoy en un dilema con el patrón Agregado la cuestión es que tengo dos entidades

public class PayCenter : BaseVersionedEntity<Guid>
{
    public string Code { get; set; }
    public string Description { get; set; }
    public bool IsIndicator { get; set; }
    public Guid AreaId { get; set; }
    public virtual Area Area { get; set; }
}

public class Area : BaseVersionedEntity<Guid>
{   
    public string Code { get; set; }
    public string Description { get; set; }
    public bool IsMultiCenter { get; set; }
    public bool IsIndicator { get; set; }
    public virtual ICollection<PayCenter> PayCenters { get; set; }
}

Tengo las siguientes dudas:

  1. Si pongo el área como entidad root, lo cual deriva a tener un repositorio, como puedo acceder a todos mis centros desde la capa de servicio, sin tener que pasar por todas las áreas.
  2. Si dejo las dos entidades como root, es valido tener dos repositorios y crear un centro de pago usando un área previamente obtenida?
  3. Debería tener 1 o 2 agregados para este caso?
3
задан 18.05.2016, 22:53
2 ответа

Для того, чтобы организация считалась Aggregate root, будь должен выполнять с sgtes условия (Согласно книге Домаин Дривен Десигн де Эрик Эванс):

  • Иметь глобальное тождество и отвечать из-за того, что санкционировать неварианты.

    Ни у одного из двух классов нет логика, присоединенная тем, что не возможно говорить об организациях. Он более одинокий они, кажется, представляют mapeo организаций возможно для того, чтобы оно функционировало с ORM. Санкционировать неварианты значит например, если он состоит в том, что существует логика, которую он проверял бы все те PayCenter как максимум они могут быть присоединенными с одним Area эта должна бы быть санкционированной в методе AddPayCenterpertenceciente в класс Area

  • Организация у корня должно быть глобальное тождество, у организаций внутри атташе должно быть только локальное тождество внутри атташе.

    Согласно коду, кажется, не propiedada AreaId в классе Area. Кроме того свойства Code обоих он, кажется, показывает, что у них есть оба, собственное тождество из-за того, что они могут быть соглашенными отдельно.

  • Ничто вне предела атташе не может mantenere ссылки ни на что внутри, кроме в организацию корень. Организация корень может вручать ссылки внутренних организаций на другие объекты, только если они использованы временно в единственном методе или блоке.

    Это не является возможным проверения только с показанным кодом

  • Только aggregate roots могут быть полученными прямо используя queries базы данных. Оставшаяся часть должна быть соглашенной пробегая связи между организациями

    Если они добавлены обе организации единственной организации, у каждой должно бы быть его собственное хранилище. Если только Area это тогда aggregate root нужно соглашаться на PayCenter только через Площадь и не нуждаться в вашем собственном хранилище.

  • Объекты внутри атташе могут поддерживать ссылки на других атташе

    Это ограничение выполнено

  • Операция уничтожения должна перемещать всю добавку в единственной операции.

    Не возможно определять это с представленным кодом

  • Когда изменение в объект внутри атташе - "commiteado", все неварианты атташе должны быть удовлетворенными.

    У организаций нет какой-либо логики, так что не возможно определять, если это выполняется или нет.

Отвечая твои вопросы:

  1. Если я помещаю площадь как организация root, что происходит, чтобы иметь хранилище, как я могу соглашаться на все мои центры со слоя услуги, не будучи должен проходить по всем площадям.

    Согласно DDD строго говоря это не было бы должно быть возможным. Если ты нуждаешься в том, чтобы сделать это PayCenter они не были бы должны составлять часть атташе Area

  2. Если я оставляю две организации, как root, стоится иметь два хранилища и создавать центр оплаты используя площадь заблаговременно полученная?

    Если, нет ограничений в этом чувстве, так что, если он действительный

  3. Он был бы должен иметь 1 или 2 добавки для этого случая?

    Хороший это зависит от того, чего ты стараешься добиваться. Как кажется, ты нуждаешься в том, чтобы согласиться прямо в PayCenter не происходя из-за Area а следовательно ты вероятно должен моделировать этому как два разведеных атташе.

1
ответ дан 24.11.2019, 14:34

Поскольку ты выдвигаешь, кажется, что Area он не представляет root agregate.

, Может быть, должен был быть какой-то другой концепцией тот, которого одна способ работать между area и centros de pago, это ты это был бы должен искать с экспертами домена.

Или где-то здесь не существовала никакая концепция, которая группировала бы их, и это было две отдельные организации, которые simplemte связаны между если. Если это случай, у тебя будет два хранилища один для каждой организации.

Эффективе Аггрегате Design

Тема состоит в том, что, когда ты используешь entity framework, ты сможешь implemetar Include() а следовательно возвращая площадь ты также сможешь получать в той же операции присоединенный список paycenter.

Лоадинг Релатед Entities

Cuando ты моделируешь безопасному UML знаешь, что существуют несколько способов присоединять организации, это могли бы быть agregates или composition, согласно которым так зависел бы жизненный цикл организации касательно Вашей связи с другой. Вот, что видеть, как удаляются связи.

UML Класс Диаграм: Association, Aggregation and Composition

0
ответ дан 24.11.2019, 14:34