Какой из них лучше моделирования предметной области в DDD?


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

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

Решение #01, Модель сотрудника с вложенным агрегатом.

public class Employee : BusinessObject, IEmployee
{
     IList<IEmployee> ManagedStaffs { get; set;}
     IEmployee Supervisor { get; set;}
}

Таким образом, мы можем использовать его как:

var emp = empRepository.Get(1);
// dot accessors
var numberOfPeople = emp.Supervisor.ManagedStaffs[0].ManagedStaffs.Count;

Решение №2, модель сотрудника без вложенного агрегата.

public class Employee : BusinessObject, IEmployee
{
    //without nested aggregate
}

public class Supervisor : Employee, ISupervisor
{
    IList<IEmployee> ManagedStaffs { get; set; }
}

Таким образом, мы можем использовать его как:

var emp1 = empRepository.Get(1);
// GetManagedStaffs needs a parameter which is a ISupervisor
var empList1 = empRepository.GetManagedStaffs(emp1.Supervisor);
var empList2 = empRepository.GetManagedStaffs(empList[0]);
var numberOfPeople = empList2.Count;

Если мы хотим сохранить доменные объекты без ORM, просто чистый ADO.NET, решение №2 выглядит намного лучше.

Если мы хотим использовать dot accessor в решении #1, прозрачная структура ORM должна быть introductd, и ленивая загрузка приветствуется из-за рекурсивно вложенного агрегата.

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

Могу я получить ваше предложение? или мне что-то нужно исправить?

Спасибо.

2 2

2 ответа:

Второе решение гораздо лучше.

Сначала агрегаты должны быть небольшими. Обычно не все операции требуют всех агрегатных компонентов. Если aggregate будет большим - все его части будут загружены в память, будет сложнее реализовать логику персистентности для такого агрегата, запросы к базе данных будут более сложными (очевидно, что операции персистентности окажут огромное влияние на производительность для больших агрегатов). Вы хотите смягчить эти последствия с помощью функций ленивой загрузки Но ленивая загрузка требует большего внимания и контроля - вы должны точно знать, что и когда загружается. Также с точки зрения производительности лучше загружать все агрегаты одним запросом, чем несколькими запросами, как в lazy load.

Во-вторых, использование первого сценария нарушает закон Деметры (https://en.wikipedia.org/wiki/Law_of_Demeter ). С этого момента использование сценария №2 становится чище.

#решение 2 Хорошее. Между руководителем и сотрудником существуют хорошие отношения "есть-есть". Но эти отношения в будущем приведут к проблемам сцепления. Вы меняете сотрудника, я боюсь, что руководитель также пострадает. Другим решением может быть предпочтение "композиции перед наследованием", а также Решение № 1. Решение за вами