Entity Framework Code First DTO или Модель для пользовательского интерфейса? - PullRequest
2 голосов
/ 02 сентября 2011

Я создаю совершенно новое приложение, включая базу данных, и собираюсь сначала использовать Entity Framework Code.Он также будет использовать WCF для сервисов, который также открывает его для нескольких пользовательских интерфейсов для разных устройств, а также делает API сервисов пригодным для использования из других неизвестных приложений.

Я видел это в нескольких постах здесь на SOно я не вижу прямых вопросов или ответов, касающихся Code First, хотя есть несколько упоминаний POCO.Я собираюсь задать вопрос еще раз, так что здесь он идет - действительно ли мне нужны DTO с Entity Framework Code First или я могу использовать модель в качестве набора общих объектов для всех границ?Я действительно пытаюсь следовать ходу мыслей ЯГНИ, поэтому, имея чистый лист бумаги, я решил, что первым делом с этим справлюсь.

Спасибо, Пол Сперанса

Ответы [ 3 ]

2 голосов
/ 02 сентября 2011

Нет определенного ответа на эту проблему, и это также причина, по которой вы не нашли ни одного.

Собираетесь ли вы строить сервисы, обеспечивающие операции CRUD? Как правило, это означает, что ваши службы смогут возвращать, вставлять, обновлять и удалять сущности такими, какие они есть = вы всегда будете предоставлять всем клиентам всю сущность или одну точно определенную сериализуемую часть сущности. Но как только вы это сделаете, стоит проверить WCF Data Services.

Собираетесь ли вы разоблачить бизнес-фасад, работающий с юридическими лицами? Фасад обеспечит реальные бизнес-методы, а не только операции CRUD. Эти методы позволяют получить некоторый объект данных и разложить его на несколько объектов в бизнес-логике. Здесь имеет смысл использовать конкретный DTO для каждой операции. DTO будет передавать только данные, необходимые для операции, и возвращать только дату, разрешенную для клиента.

Очень простой пример. Предположим, что ваши сущности хранят информацию типа LastModifiedBy. Это, вероятно, информация, которую вы хотите передать клиенту. В первом сценарии у вас есть один сериализуемый набор, так что вы передадите его обратно клиенту, а клиент передаст его обратно в службу. Теперь вы должны убедиться, что клиент не изменил поле, потому что у него, вероятно, не было разрешений для этого. Вы должны сделать это с каждым полем, которое клиент не имел разрешения изменить. Во втором сценарии ваш DTO с обновленными данными просто не будет включать это свойство (= специализированный DTO для вашей операции), поэтому клиент вообще не сможет отправить вам новое значение.

Это может быть как-то связано с тем, как вы хотите работать с данными и где будет применяться ваша реальная логика. Это будет на службе или на клиенте? Как вы будете гарантировать, что клиент не будет публиковать неверные данные? Вы хотите ограничить передачу неверных данных по логике или по конкретным переданным объектам?

1 голос
/ 02 сентября 2011

Я настоятельно рекомендую модель с выделенным видом.

Это значит:

Тем не менее, с помощью службы данных WCF трудно игнорировать преимущество возможности писать службу по существу в одну строку, когда вы предоставляете сущности напрямую. Так что это может быть наиболее целесообразным для WCF / серверной стороны.

Но когда дело доходит до пользовательского интерфейса, он вам "понадобится".

0 голосов
/ 05 июля 2015

действительно ли мне нужны DTO с кодом Entity Framework First или я могу использовать модель в качестве набора общих объектов для всех границ?

Да, тот же набор POCOs/ entities можно использовать для всех границ.

Но для преобразования сущностей в некоторые общие структуры каждого уровня потребуется набор картографов / преобразователей / конфигураторов.

Например, когдасущности настроены с атрибутами DataContract и DataMember, WCF может передавать состояние объектов домена без создания каких-либо специальных классов.

Аналогично, когда сущности сопоставляются с использованием Entity Framework fluent mapping api,EF может сохранять состояние объектов домена в базе данных без создания каких-либо специальных классов.

Таким же образом, объекты могут быть настроены для использования на любом уровне посредством инфраструктуры уровней без создания каких-либо специальных классов..

...