2011-01-28 3 views
7

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

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

+1

Возможный дубликат [WCF, Entity Framework & Data Contracts] (http://stackoverflow.com/questions/1121877/wcf-entity-framework-data-contracts) –

ответ

8

Как наилучшая практика, вам обязательно нужно вернуть класс DTO/POCO, который явно разработан как контракт с данными и не имеет логики постоянства.

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

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

+0

Спасибо. Является ли обычный возврат DTO обратно в EntityObject на клиенте или предпочитается создать новую модель для целей клиента? – Rachel

+0

Очевидно, это зависит от вашей архитектуры, но если у клиента есть локальная копия базы данных, вы можете преобразовать DTO обратно в EntityObject. Суть заключается в том, чтобы содержать контракт в чистоте, чтобы служба не подразумевала какую-либо конкретную реализацию, она просто предоставляет данные в формате ванили. –

+0

Клиент должен просто работать с DTO, который является типом, предоставляемым сервисом, который он потребляет, и является более простым, конечно. Если у вас нет необходимости использовать контекст на клиенте со всеми функциями объектов по какой-либо причине (что я сомневаюсь, потому что это клиент справа?). – kzfabi

0

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

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

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