Я пытаюсь разработать приложение, которое имеет сложный бизнес-домен и требует поддержки REST API (не только REST, но и ориентированного на ресурсы). У меня есть некоторые проблемы, связанные с поиском модели предметной области, ориентированной на ресурсы.
В DDD клиентам доменной модели необходимо пройти процедурный уровень «Службы приложений», чтобы получить доступ к любой бизнес-функциональности, реализованной сущностями и доменными службами. Например, есть сервис приложений с двумя методами для обновления сущности User:
userService.ChangeName(name);
userService.ChangeEmail(email);
API этой службы приложений предоставляет команды (глаголы, процедуры), а не состояния.
Но если нам также нужно предоставить RESTful API для того же приложения, то существует модель ресурсов пользователя, которая выглядит следующим образом:
{
name:"name",
email:"email@mail.com"
}
Ресурсно-ориентированный API предоставляет состояние , а не команды . Это вызывает следующие проблемы:
каждая операция обновления для REST API может отображаться на один или несколько вызовов процедур Application Services в зависимости от того, какие свойства обновляются в модели ресурсов.
каждая операция обновления выглядит как атомарная для клиента REST API, но она не реализована таким образом. Каждый вызов службы приложений разработан как отдельная транзакция. Обновление одного поля в модели ресурсов может изменить правила проверки для других полей. Поэтому нам нужно проверить все поля модели ресурсов вместе, чтобы убедиться, что все потенциальные вызовы службы приложений действительны, прежде чем мы начнем их делать. Одновременная проверка набора команд гораздо менее тривиальна, чем выполнение по одной. Как мы можем это сделать на клиенте, который даже не знает, что существуют отдельные команды?
Вызов методов службы приложений в другом порядке может иметь другой эффект, в то время как REST API делает его похожим, что нет никакой разницы (в пределах одного ресурса)
Я мог бы придумать более похожие проблемы, но в основном все они вызваны одним и тем же. После каждого вызова службы приложений состояние системы меняется. Правила того, что является действительным изменением, набором действий, которые субъект может выполнить при следующем изменении. Ресурсно-ориентированный API пытается сделать все это похожим на атомарную операцию. Но сложность преодоления этого разрыва должна куда-то уходить, и это кажется огромным.
Кроме того, если пользовательский интерфейс более ориентирован на команды, что часто имеет место, то нам придется сопоставлять команды и ресурсы на стороне клиента, а затем обратно на стороне API.
Вопросов:
- Должна ли вся эта сложность обрабатываться (толстым) слоем отображения REST-to-AppService?
- Или я что-то упустил в моем понимании DDD / REST?
- Может ли REST просто быть непрактичным для демонстрации функциональности моделей предметной области при определенной (довольно низкой) степени сложности?