развернутый ответ:
Давайте попробуем проанализировать эту ситуацию, не слепо говоря, что ни один не делать такие вещи.
DTO - это структуры, которые содержат только данные и передают их между границами.
Модель домена - ключевое слово здесь «Модель» - это абстракция вашего домена, которая решает его проблемы. Из представления OO это простой класс, если вы разложите его на части, это будут чистые данные (DTO) и чистое поведение без гражданства (служба или доменная служба в терминах DDD).
Теперь давайте возьмем пример шаблона MVVM, особенно его часть VM. View Model - ключевое слово здесь снова «Модель» - это абстракция взгляда, которая решает ее проблемы. Есть много способов, которыми люди это реализуют, некоторые объекты Domain Domain, некоторые из них конвертируют, некоторые обертывают DTO. Дело в том, что View Model - это модель домена для представления, она почти такая же, как любая модель. Тогда почему люди ограничивают способ реализации Domain Model.
Теперь вернемся к модели DTO и доменов. Как я сказал выше, мы можем разбить объект домена на DTO и службу. Давайте рассмотрим, что мы рассматриваем объект Domain как поведенческую оболочку вокруг DTO (как, например, MVVM). Где это ведет нас:
- Сначала мы прерываем инкапсуляции OO. Это плохо, потому что это предотвращает неправильное использование наших данных объекта.Кто-то может заставить данные объекта домена (DTO) напрямую манипулировать им и помещать нашу модель в недействительное состояние. Это огромно.
- Мы можем легко перенести границы объекта, веб-сервисы, сериализацию, клонирование, мы можем отделить часть данных и предоставить ее нашему хранилищу данных или веб-сервису. Это очень важно для распределенных систем.
Продолжим, нарушая инкапсуляцию, является серьезной проблемой. Нам нужен способ гарантировать, что наши данные объекта домена не будут обрабатываться напрямую, только Domain Object должен манипулировать им. Мы можем добиться этого, сделав постоянный объект только для чтения DTO, если он находится вне объекта Domain.
Теперь о повторном использовании DTO, Inheritance vs Composition. Кто-то сказал: предпочитайте композицию над наследованием, и я лично следую этому правилу. Но вам нужно проанализировать ваши конкретные ситуации. Правило говорит «предпочитают» не подчиняться.
Оригинал Asnwer:
Хотя я лично не видел такой подход слишком часто, я думаю, этот метод занижен, и это потенциально может быть очень хорошим.
Я видел такие вопросы, заданные много раз, и все ответы были: не делайте этого, потому что никто не делает таких вещей. Не бойтесь экспериментировать.
Райан Беннет написал в своем ответе:
Это может быть легко сейчас, но это может быть Мейнтаненс кошмар в будущем.
Ну, это правда, но что, если будущего не будет, или это небольшой проект, я бы придерживался правил YAGNI, TDD и Agile и выполнял минимальную работу, которая выполняет эту работу.
Код не то, что вы гравируете в камне и никогда не касаетесь, когда вам нужно, вы можете реорганизовать и ввести DTO, использовать auto-mapper или что-то еще.
Dto == структурный, Do == поведенческий. В какой вселенной они бы разделили базовый класс? –
DO == поведение + структура == поведение + Dto. Так я и думал. – hgulyan
DO = структурировано для ** транзакций **, DTO = структурировано для ** запроса ** данных для отображения в пользовательском интерфейсе. Их структуры и ** должны быть разными. Попытка объединить их вместе приведет к плохой ситуации. –