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