Должна ли служба WCF возвращать EntityObject или класс POCO / DTO?

Я просмотрел множество примеров WCF с использованием EntityFramework, и большинство из них, похоже, возвращают клиенту какой-то класс POCO или DTO.

Мне было интересно, почему это произошло, поскольку по умолчанию EntityObject включает атрибуты [DataContract] и реализует INotifyPropertyChanged. Лучше ли возвращать класс DTO или POCO, чем EntityObject (или наоборот)? И есть ли конкретные случаи, когда лучше использовать одно возвращаемое значение над другим?


person Rachel    schedule 28.01.2011    source источник
comment
возможный дубликат WCF, Entity Framework и контрактов на данные   -  person John Saunders    schedule 28.01.2011


Ответы (2)


Лучше всего, чтобы он возвращал класс DTO / POCO, который явно разработан как контракт данных и не имеет логики сохранения.

Причина в том, что если вы передаете EntityObject, вы делаете предположение, что у потребителя сервиса будет ссылка на тот же контекст данных, и это нарушает принцип явных границ SOA. Это снижает возможность повторного использования вашего сервиса.

Вероятно, что Microsoft реализовала DataContract на EntityObject для поддержки некоторых из своих инструментов доступа к базам данных на основе WCF, таких как RIA. INotifyPropertyChanged предназначен для поддержки привязки WPF и не связан с WCF или контрактами данных.

person Guy Starbuck    schedule 28.01.2011
comment
Спасибо. Обычно ли DTO возвращают в объект EntityObject на клиенте, или предпочтительнее создать новую модель для целей клиента? - person Rachel; 28.01.2011
comment
Очевидно, это зависит от вашей архитектуры, но если у клиента есть локальная копия базы данных, вы можете преобразовать DTO обратно в EntityObject. Дело в том, чтобы содержать контракт в чистоте, чтобы служба не предполагала какой-либо конкретной реализации, а просто предоставляла данные в ванильном формате. - person Guy Starbuck; 28.01.2011
comment
Клиент должен просто работать с DTO, которые представляют собой тип, предоставляемый службой, которую он потребляет, и, конечно же, более простой. Если у вас нет необходимости использовать контекст на клиенте со всеми функциями сущностей по какой-то причине (в чем я сомневаюсь, потому что это клиент, верно?). - person kzfabi; 28.11.2012
comment
Кстати: я рекомендую использовать EntitiesToDTOs для автоматического создания DTO и ассемблеров из вашего EDMX-файла Entity Framework. СУХОЙ! - person kzfabi; 28.11.2012

В некоторых случаях, когда вы не знаете о логике сохранения, стоит вернуть POCO. Я имею в виду, что тот же POCO может быть подключен к другому ORM или для других целей. Хорошо, это преимущество POCO над ORM, но оно также дает вам повышение производительности по сравнению с EntityObject, которое добавляет время выполнения прокси / уведомителей.

Возврат POCO - вам необходимо вручную обновить состояние объекта при получении от WCF.

Возвращение EntityObject - вы получаете объект с поддерживаемым состоянием.

person indiPy    schedule 28.01.2011