Как я могу отправить объекты POCO через службу WCF, если я не хочу отслеживать объект * позже *?

У меня есть проект ASP.NET MVC 4, где контроллер вызывает уровень службы WCF, который вызывает бизнес-уровень, который использует репозиторий объектов EF 5.0. Затем результаты возвращаются в Контроллер как объекты POCO.

Он отлично работает, пока служба WCF напрямую упоминается как библиотека, но я знаю, что она не будет работать, указанная как служба, потому что их нужно будет сериализовать, а с включенным ProxyCreation это невозможно.

Я не хочу создавать DTO, потому что я использую сгенерированные сущности POCO, поэтому, по моему скромному мнению, они существуют. Я хочу отслеживать изменения только до того, как объекты POCO достигнут уровня обслуживания.

Многие люди говорят об использовании DTO, даже если они идентичны POCO. Если я сделаю это, я смогу создать автоматически сгенерированные скопированные классы просто с разными именами, чтобы они были «POCO с отключенным прокси как DTO», что было бы немного странно .

Могу ли я убить прокси-класс POCO таким образом, чтобы объект мог быть сериализован при возврате из уровня сервиса?

Также я не знаю, является ли эта идея хорошей практикой. Но было бы здорово отправить «чистые» объекты на мои Контроллеры, готовые для меня, сопоставленные с ViewModels. Я тоже ищу производительность.


person eduardobr    schedule 28.11.2012    source источник
comment
... но я знаю, что на него нельзя ссылаться как на службу, потому что они должны быть сериализованы, а с включенным ProxyCreation это невозможно. Что ты имеешь в виду? Вы хотите сказать, что классы POCO не будут сериализованы?   -  person Umair Ishaq    schedule 28.11.2012
comment
Да, не будет сериализован, если экземпляр сгенерирован запросом EF и ProxyCreationEnabled = true (по умолчанию). Если экземпляр создается вручную, он сериализуется, поскольку прокси-сервер не отслеживает изменения.   -  person eduardobr    schedule 28.11.2012
comment
Для чего вы используете прокси - отслеживания изменений или отложенной загрузки? Я думаю, вам нужно либо отключить генерацию прокси, либо клонировать объект в его экземпляр базового типа.   -  person Pawel    schedule 29.11.2012
comment
Я тестирую ProxyDataContractResolver, этот класс готов в .NET 4.5 ... Я собираюсь проверить, есть ли побочные эффекты, и опубликовать результаты здесь   -  person eduardobr    schedule 29.11.2012


Ответы (2)


Проблема решается с помощью ProxyDataContractResolver. Мы тоже должны использовать [Serializable] and [DataContract(IsReference=true)]. С помощью этой комбинации можно включить ProxyCreation.

person eduardobr    schedule 30.11.2012

Мы справились с этим следующим образом:

  1. Настройте T4, генерирующий классы POCO, чтобы он генерировал классы, украшенные атрибутом [Serializable()] and [DataContract(IsReference=true)].
  2. И интерфейс (представления), и серверная часть (сервис / бизнес-уровень wcf) ссылаются на классы, созданные POCO, поскольку вы не будете использовать прокси из-за IsReference = true.

и это в основном все.

При этом вам не нужно создавать DTO и просто использовать классы POCO как в бэкэнде, так и во внешнем интерфейсе.

Однако имейте в виду, что WCF, использующий дескрипторы IsReference = true, не любит избыточных объектов (поэтому это может быть проблемой для некоторых классов POCO со свойствами навигации).

person jr pineda    schedule 29.11.2012
comment
[DataContract (IsReference = true)] отлично работает с отключенным прокси, но я хочу воспользоваться ProxyCreaton перед передачей объекта - person eduardobr; 29.11.2012