Я читал мысли Грега Янга и Уди Дахана о командообразовании Ответственное разделение, и многое из того, что я читаю, вызывает у меня аккорд. Мой домен (мы отслеживаем транспортные средства, которые делают поставки) имеет концепцию маршрута, который содержит один или несколько остановок. Мне нужно, чтобы мои клиенты могли установить их в нашей системе, позвонив в веб-сервис, а затем сможет получить информацию о маршруте и о том, как продвигается транспортное средство.CQRS - Должна ли команда попытаться создать «сложную» сущность master-detail?
В прошлом у меня были бы «вырезанные» классы DTO, которые очень похожи на мои классы домена, и клиент создавал RouteDto с массивом StopDto (s) и вызывал наш веб-метод CreateRoute, передавая в RouteDto , Когда они запрашивают нашу систему, вызывая метод GetRouteDetails, я бы возвращал им те же самые объекты. Одним из привлекательных аспектов CQRS является то, что RouteDto может иметь всевозможные свойства, которые клиент хочет запросить, но не имеет деловых параметров при создании маршрута. Поэтому я создаю отдельный класс CreateRouteRequest, который передается при вызове команды CreateRoute, и класс DTO маршрута, который возвращается как результат запроса.
class Route{
string Reference;
List<Stop> Stops;
}
Но мне нужен мой клиент, чтобы предоставить мне информацию о маршруте и остановке, когда они создают маршрут. Как я вижу, я мог бы ...
Дайте моему классу CreateRouteRequest свойство Stops (s), которое представляет собой массив «что-то», представляющее данные, необходимые для каждой остановки, но что я называю этим классом ? Это не Stop, так как я называю список DTO внутри своего маршрута DTO, но мне не нравится «CreateStopRequest». Я также задаюсь вопросом, не застрял ли я в мышлении CRUD, думая в терминах информации о мастер-деталях и прося, чтобы клиент тоже так думал.
class CreateRouteRequest{
string Reference;
...
List<CreateStopRequest> Stops;
}
или
Они называют CreateRoute, а затем сделать несколько звонков метода AddStopToRoute. Это кажется немного более «поведенческим», но я потеряю способность обрабатывать создание маршрута, включая его остановки, как одну атомную команду. Если они создают маршрут и затем пытаются добавить Stop, который не удается из-за некоторой проблемы проверки, у них будет частично правильный маршрут.
Тот факт, что я не могу найти хорошее имя для списка объектов «StopCreationData», с которыми я буду работать в варианте 1, заставляет задуматься, есть ли что-то, что мне не хватает.