Предположим, у вас есть канонический объект домена Customer. У вас есть три разных экрана, на которых отображается клиент: внешний администратор, внутренний администратор и учетная запись обновления.Построение объекта домена из нескольких DTO
Предположим далее, что на каждом экране отображается только подмножество всех данных, содержащихся в объекте Customer.
Проблема заключается в следующем: когда пользовательский интерфейс передает данные с каждого экрана (например, через DTO), он содержит только это подмножество полного объекта домена Клиента. Поэтому, когда вы отправляете этот DTO на фабрику клиентов для повторного создания объекта Customer, у вас есть только часть Клиента.
Затем вы отправляете этого Клиента в Репозиторий клиентов, чтобы сохранить его, и куча данных будет уничтожена, потому что его там нет. Наступает трагедия.
Итак, вопрос: как бы вы справились с этой проблемой?
Некоторые из моих идей:
включает аргумент Repository, показывающий, какую часть Клиента обновить, и игнорировать других
при загрузке клиента, сохранить его в статической памяти или в сеансе или где угодно, а затем, когда вы получаете один из DTO из пользовательского интерфейса, обновите только те части, которые относятся к DTO
IMO, оба из которых являются kludges. Есть ли другие лучшие идеи?
@chadmyers: В этом проблема.
Сущность обладает свойствами А, В, С и D.
DTO # 1 содержит свойства для В и С.
DTO # 2 содержит свойства для C и D.
UI спрашивает для DTO # 1 вы загружаете объект из репозитория, конвертируете его в DTO # 1, заполняя только B и C и передавая его в пользовательский интерфейс.
Теперь UI обновляет B и отправляет обратно DTO. Вы воссоздаете объект, и он заполнен только B и C, потому что это все, что содержится в DTO.
Теперь вы хотите сохранить объект, который заполнен только B и C, с A и D null/blank. Репозиторий не знает, должен ли он обновлять A и D в качестве пробелов или игнорировать их.
Неважно, если это веб-приложение или нет. И проблема в том, что нет «DTO», но разных, и никто из них полностью не описывает Клиента, а лишь часть его. – moffdub
Это имеет значение, потому что если это состояние, вы можете использовать другой подход, чем частичная вещь DTO, и это то, что я собираюсь исследовать. И неважно, полностью ли это описывает DTO, и это не нужно. – chadmyers
Вы правы, один из вариантов - перепроектировать DTO. Я не упомянул о том, что дизайн DTO, вероятно, из моих рук. Предполагаете ли вы, что вместо отдельного класса DTO объект Customer реализует интерфейс DTO? – moffdub