Какой из них лучше моделирования предметной области в 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 ответа:
Второе решение гораздо лучше.
Сначала агрегаты должны быть небольшими. Обычно не все операции требуют всех агрегатных компонентов. Если aggregate будет большим - все его части будут загружены в память, будет сложнее реализовать логику персистентности для такого агрегата, запросы к базе данных будут более сложными (очевидно, что операции персистентности окажут огромное влияние на производительность для больших агрегатов). Вы хотите смягчить эти последствия с помощью функций ленивой загрузки Но ленивая загрузка требует большего внимания и контроля - вы должны точно знать, что и когда загружается. Также с точки зрения производительности лучше загружать все агрегаты одним запросом, чем несколькими запросами, как в lazy load.
Во-вторых, использование первого сценария нарушает закон Деметры (https://en.wikipedia.org/wiki/Law_of_Demeter ). С этого момента использование сценария №2 становится чище.
#решение 2 Хорошее. Между руководителем и сотрудником существуют хорошие отношения "есть-есть". Но эти отношения в будущем приведут к проблемам сцепления. Вы меняете сотрудника, я боюсь, что руководитель также пострадает. Другим решением может быть предпочтение "композиции перед наследованием", а также Решение № 1. Решение за вами