Как управлять инвариантами через совокупный корень - PullRequest
0 голосов
/ 26 августа 2018

Если у меня есть два класса [Shift,ShiftDetails], где [Shift] - совокупный корень. на основе определенного поля я хочу ограничить количество экземпляров ShiftDetails.


Я создаю класс ShiftDetailsView, затем создаю два метода в Shift совокупный корень для управления инвариантом:

  • public IEnumerable ConstructShift (); // на основе поля NumberOfSuccessions

Этот метод должен создать количество инициализированных ShiftDetailsView на основе этого поля, а затем добавить их в список и вернуть результат пользователю (разработчику) как IEnumerable.

Затем пользователь должен вызвать CompleteShift после заполнения первоначального IEnumerable, возвращенного из предыдущего метода:

  • открытый список CompleteShift (IEnumerable shiftDetailsViews)

Я сделал два отдельных шага, чтобы контролировать количество потомков через совокупный корень, и я думаю, что есть лучшие способы сделать это, чтобы гарантировать (ACID) всего этого.


Исходя из комментариев, вопрос нуждается в дополнительном разъяснении, и, поскольку я пытаюсь упростить проблему, я допустил ошибку и изменил реальную проблему. потому что, когда мы решаем проблемы с доменом, мы должны быть точными и уточнить точную проблему. Поэтому я попытаюсь объяснить это более подробно.

У меня есть два следующих агрегата:

1. Первый агрегат

1-WorkingSystem: (совокупный корень)

    private readonly ICollection<WorkingTime> _assignedWorkingTimes;

    public string Name { get; private set; }
    public short NumberOfSuccessions { get; private set; }
    public Week WeekStart { get; private set; }
    public bool IsActive { get; private set; }
    public bool IsDefault { get; private set; }
    public short NumberOfWeekends { get; private set; }
    public virtual ICollection<WorkingTime> AssignedWorkingTimes { get => _assignedWorkingTimes; }
* * Пример тысячу сорок четыре: * * 1045
 Id |Name     | NumberOfSuccessions|WeekStart|IsActive|NumberOfWeekends 
  1 |Employees|       2            |Sunday   |  1     |   2
  2 |Lecturers|       1            |Saturday |  1     |   1

2-WorkingTime:

public string Name { get; set; }
public short NumberOfHours { get; set; }
public int WorkingSystemId { get; private set; }

Пример: * * тысяча пятьдесят-четырь

Id|Name   |  NumberOfWorkingHours  | WorkingSystemId 
 1|Summer |  8                     | 1
 2|Winter |  6                     | 1
 3|General|  8                     | 2

2. Второй агрегат

3-Shift (совокупный корень).

private readonly List<ShiftDetail> _assignedShiftDetails;
public string Name { get; set; }
public ShiftType ShiftType { get; set; }
public int WorkingSystemId { get; set; }
public virtual WorkingSystem WorkingSystem { get; set; }
public virtual IEnumerable<ShiftDetail> AssignedShiftDetails { get => _assignedShiftDetails; }

Пример: * * одна тысяча шестьдесят пять

Id|Name            |ShiftType | WorkingSystemId 
1 |restaurant-shift|Morning   |  1

4- ShiftDetails:

public Guid ShiftId { get; private set; }
public int WorkingTimeId { get; set; }
public DateTimeRange ShiftTimeRange { get; set; }
public virtual WorkingTime WorkingTime { get; set; }
* +1073 * Пример: * 1 074 *
 ShiftId = 1|WorkingTimeId = 1|ShiftStart = 8:00|ShiftEnd = 16:00
 ShiftId = 1|WorkingTimeId = 2|ShiftStart = 9:00|ShiftEnd = 15:00

Теперь я хочу ограничить количество деталей на основе NumberOfSuccessions для каждой рабочей системы! и поскольку у меня есть доступ к WorkingSystemId в моем совокупном корне Shift, я могу получить доступ к этой информации.

Не могли бы вы помочь мне контролировать количество экземпляров на основе поля в совокупном корне?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я бы добавил метод с именем AssignedShiftDetail (ShiftDetail shiftDetail) в класс Shift и реализовал бы любую связанную логику внутри этого метода.

0 голосов
/ 29 августа 2018

Не могли бы вы помочь мне контролировать количество экземпляров на основе поля в совокупном корне?

Использование этих двух методов заключается только в создании новой смены. и потому что я новичок в DDD, я думаю, что не правильно ограничил инварианты

О, я вижу - вас особенно беспокоит то, что происходит в транзакции, которая создает совокупность.

Обычный шаблон, описанный Эриком Эвансом (глава 6), заключается в том, что модель домена будет представлять фабрику , которая знает, как получать данные из приложения и возвращать новый агрегатный экземпляр.

Внутри этой фабрики вы создаете все значения, которые составляют начальное состояние агрегата. Значения понимают свои собственные ограничения («Я Amount, поэтому мне нужно целое число, большее или равное нулю»; «Я Money, поэтому мне нужен ненулевой Amount и ненулевой CurrencyCode).

Фабрика принимает данные из приложения, создает график значений и в конце вызывает конструктор агрегата с текущим состоянием.

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

Так, например, может быть, что ваша фабрика возьмет NumberOfDetails и List<ShiftDetails> и из них создаст тип VerifiedDetails, из которого в конечном итоге будет построен агрегат.

Очень хорошее прочтение об этом подходе - Книга Скотта Влашина Моделирование предметной области, сделанная функциональной .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...