У DDD чи доменна послуга є лише фасадом та / або посередницьким малюнком?


13

У дизайні, керованому доменом, у шарі домену можуть бути декілька (традиційних) послуг. Наприклад, для домену Користувача ми можемо мати:

  • UserFactory, який будує об’єкти користувача різними способами
  • UserRepository, який відповідає за взаємодію зі службами збереження в інфраструктурному шарі

Чи є UserService в доменному шарі просто посередником та / або фасадом для цих двох сервісів та інфраструктурного шару, чи є в ньому більше?


1
Дивіться також Послуги в DDD та Послуги в DDD
Ерік Еддт

Я багато читав дописи рівня Городинського, хоча жодного другого посилання не бачив. Чудово читати, безумовно, торкається деяких важливих моментів!
e_i_pi

Відповіді:


11

Domain services найкраще описуються тим, чим вони не є:

  • вони не є ні EntitiesніAggregate roots
  • вони не Value objects
  • нести доменні знання, які, природно, не відповідають лише одному Entity або одному Value object

Приклад a Domain service- це Saga/Process manager: він координує тривалий запущений процес із залученням кількох Aggregate roots, можливих із різних Bounded contexts.

Як говориться, що таке Domain serviceі як це реалізується - це дві ортогональні речі.

Чи є UserService в доменному шарі просто посередником та / або фасадом для цих двох сервісів та інфраструктурного шару, чи є в ньому більше?

Деякі доменні сервіси, такі як UserRepository(складається з інтерфейсу, визначеного в Domain layerта конкретної реалізації в Infrastructure layer), можуть бути реалізовані за допомогою Facadeшаблону дизайну. Інші доменні служби не є.

Там немає жорсткого правила про те , як їх реалізувати, крім важливого правила про те , що Domain layerнеобхідно не залежить від інших верств (і SOLID ).


Дякую, я думаю, що нарешті я розумію Доменний шар. Поряд із вмістом об'єктів даних (агрегати, об'єкти та об'єкти цінності), він також містить правила бізнесу, але не конкретну імплементацію цих правил. Служби доменів визначають, що можна зробити для об’єктів даних домену, але не знають, як ці операції функціонують всередині країни.
e_i_pi

1
@e_i_pi бізнес-правила захищені лише агрегатами та їх вкладеними об'єктами. Доменні служби в цьому не задіяні.
Константин Гальбену

1
@e_i_pi, коли в операції бере участь більше ніж один агрегат. Наприклад, враховуючи перелік банківських рахунків (агрегатів) особи (іншої сукупності), доменна послуга обчислила б загальний баланс цих рахунків.
Константин Гальбену

1
@e_i_pi: Я думаю, у вас є кілька помилок. Отже, весь Доменний шар є програмною моделлю вашого домену. Ви сказали - "Поряд із вмістом об'єктів даних (агрегати, об'єкти та об'єкти цінності)" - це не "об'єкти даних" в тому сенсі, що вони просто містять дані; вони реалізують правила домену, вони визначають поведінку. Тепер Служби доменів , згідно Книги DDD Е. Еванса , - це ті аспекти домену , які природним чином не вписуються в об'єкт (сутність або об'єкт цінності).
Філіп Мілованович

1
Скоріше, доменна послуга "визначається виключно з точки зору того, що вона може зробити для клієнта", визначається з точки зору інших елементів доменної моделі (тому вона якось оркеструє ці елементи і застосовує правила домену, які керують цією оркестрацією). Сама служба домену є без громадянства. Існує також концепція Служб прикладних програм , які знаходяться на рівні більш високого рівня, і по суті реалізують історії користувачів або подібні випадки використовують випадки, діючи як інтерфейс до доменного рівня. Зауважте, що співвідношення об'єктів та послуг буде змінюватися залежно від модельованого домену.
Філіп Мілованович

1

Я бачу послуги в DDD як результат інверсії залежності .

Якщо ви використовували б "просту" залежність, то ваш доменний код закликав би базу даних для збереження або запиту суб'єкта чи фабрики, що створює об'єкт, прив'язаний до бази даних або зовнішньої служби або якогось іншого коду інфраструктури.

Але доменний код не повинен бути таким. Доменний код не повинен залежати від інфраструктурного коду. Оскільки ця залежність ускладнює тестування та, можливо, повторне використання. Ось чому ви інвертуєте цю залежність. Інфраструктурний код залежить від доменного коду. А для цього потрібно ввести абстракцію. Абстракція, яка визначає, яку поведінку доменний код очікує впровадити в інфраструктуру.

І послуги в DDD - це абстракція. У більшості випадків для доменного коду ці служби повинні бути простими інтерфейсами. І реалізація повинна бути в інфраструктурному коді, який залежить від цих інтерфейсів.


Дякую за вашу відповідь, обидві відповіді разом дали мені "ага!" мить. Я думаю, що без вашої відповіді я б цілком не зрозумів цю концепцію, але я віддаю перевагу відповідь Костянтина як показник для майбутніх читачів.
e_i_pi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.