В области DDD мне нравится идея избегать геттеров и сеттеров, чтобы полностью инкапсулировать компонент, поэтому единственное взаимодействие, которое разрешено, - это взаимодействие, которое было построено поведением. Объединяя это с Event Sourcing, я могу получить хорошую историю того, что было сделано, и когда к компоненту.
Одна вещь, о которой я думал, - это когда я хочу создать, например, спокойный шлюз для основной службы. В качестве примера предположим, что у меня есть объект Task со следующими методами:
-
ChangeDueDate(DateTime date)
-
ChangeDescription(string description)
-
AddTags(params string[] tags)
-
Complete()
Теперь, очевидно, у меня будут переменные экземпляра внутри этого объекта для управления состоянием и событиями, которые будут запущены при вызове соответствующих методов.
Возвращаясь к службе REST, я вижу, что есть 3 варианта:
- Сделать URL-адреса стиля RPC, например.
http://127.0.0.1/api/tasks/{taskid}/changeduedate
- Разрешить отправку многих команд в одну конечную точку, например:
- URL:
http://127.0.0.1/api/tasks/{taskid}/commands
- Это будет принимать список команд, поэтому я мог бы отправить следующее в том же запросе:
-
ChangeDueDate
команда -
ChangeDescription
команда
-
- URL:
- Сделать по-настоящему доступный глагол RESTful, и я создаю логику домена для извлечения изменений из DTO и, в свою очередь, перевод соответствующих релевантных событий, например:
- URL:
http://127.0.0.1/api/tasks/{taskid}
- Я бы использовал глагол PUT для отправки DTO-представления задачи
- После получения я могу дать DTO реальному объекту домена задачи через метод, который может быть вызван, UpdateStateFromDto
- Затем это проанализировало dto и сравнило бы свойства сопоставления с его полями, чтобы найти различия, и могло бы иметь соответствующее событие, которое должно быть запущено, когда оно находит разницу с определенным свойством.
- URL:
Глядя на это сейчас, я чувствую, что второй вариант выглядит лучшим, но мне интересно, что думают другие народы по этому поводу, если есть известный истинный спокойный способ решения этой проблемы. Я знаю со вторым вариантом, что это был бы действительно хороший опыт с точки зрения TDD, а также с точки зрения производительности, поскольку я мог бы комбинировать изменения в поведении в один запрос, сохраняя при этом отслеживание изменений.
Первый вариант определенно будет явным, но приведет к более чем одному запросу, если нужно вызвать много действий.
Третий вариант звучит нехорошо, но я понимаю, что для него потребуется несколько тысяч действий с чистой реализацией, которая могла бы учитывать разные типы свойств, вложенность и т.д.
Спасибо за вашу помощь в этом, действительно сгибая голову через анализ паралича. Хотелось бы, чтобы некоторые советы о том, что другие думают, будут наилучшим образом из вариантов, или я упускаю трюк.