Я намагаюся створити додаток, який має складний бізнес-домен та вимогу підтримувати REST API (не суворо REST, а орієнтований на ресурси). У мене виникають проблеми з розкриттям доменної моделі орієнтованим на ресурси.
У DDD клієнтам доменної моделі необхідно пройти процедурний рівень «Служби прикладних програм», щоб отримати доступ до будь-якої ділової функціональності, реалізованої Entities and Domain Services. Наприклад, є служба додатків із двома способами оновлення сутності користувача:
userService.ChangeName(name);
userService.ChangeEmail(email);
API цієї Служби програм розкриває команди (дієслова, процедури), а не стан.
Але якщо нам також потрібно надати API RESTful для того самого додатка, то існує модель User Resource, яка виглядає приблизно так:
{
name:"name",
email:"email@mail.com"
}
API, орієнтований на ресурси, відкриває стан , а не команди . Це викликає такі проблеми:
кожна операція оновлення для API REST може відображати один або декілька викликів процедури служби служби додатків, залежно від того, які властивості оновлюються в моделі ресурсу
кожна операція оновлення схожа на атомну для клієнта API REST, але вона не реалізована так. Кожен виклик Служби додатків розроблений як окрема транзакція. Оновлення одного поля на моделі ресурсу може змінити правила перевірки для інших полів. Тому нам потрібно перевірити всі поля моделі ресурсів разом, щоб гарантувати, що всі потенційні виклики Служби додатків є дійсними, перш ніж ми починаємо їх робити. Перевірка набору команд одночасно набагато менш тривіальна, ніж виконання однієї за одною. Як це зробити для клієнта, який навіть не знає, що існують окремі команди?
виклик методів служби служб у різному порядку може мати різний ефект, тоді як API REST дозволяє виглядати, що немає різниці (в межах одного ресурсу)
Я міг би придумати більше подібних питань, але в основному всі вони викликані одним і тим же. Після кожного дзвінка до Служби додатків стан системи змінюється. Правила того, що є дійсними змінами, набір дій, які суб'єкт господарювання може виконати наступною зміною. API, орієнтований на ресурси, намагається зробити все це схожим на атомну операцію. Але складність подолання цієї прогалини повинна кудись піти, і вона здається величезною.
Крім того, якщо інтерфейс користувача більш орієнтований на команду, що часто буває, нам доведеться скласти карту між командами та ресурсами на стороні клієнта, а потім знову на стороні API.
Запитання:
- Чи повинна вся ця складність оброблятися (товстим) шаром відображення REST-to-AppService?
- Або я щось пропускаю в розумінні DDD / REST?
- Чи може REST просто не бути практичним для виявлення функціональності доменних моделей над певним (досить низьким) ступенем складності?