Добавление методов в объекты DataContract для WCF - PullRequest
4 голосов
/ 17 сентября 2010

Являются ли DataContracts в WCF не чем иным, как DTO?Я читал о WCF и просто подумал.Было бы хорошо, если бы некоторые объекты DataContract могли иметь методы для них, чтобы клиент мог выполнять с ними базовые действия до или после отправки или получения обратно в службу.

Для меня это просто не представляется возможным или логичным.Я могу ошибаться, я узнаю что-то новое каждый день.Так что лучше всего будет рассматривать DataContracts как DTO и предоставлять библиотеки для клиентов, которые будут создавать реальные объекты из DTO.Объекты, которые будут содержать методы.

Буду очень признателен за любые указания.

Ответы [ 4 ]

9 голосов
/ 17 сентября 2010

Не уверен, правильно ли я понял ваш ответ, поэтому поправьте меня, если я ошибаюсь.

Вы можете создать библиотеку классов с вашими классами DataContracts и совместно использовать библиотеку между клиентом и сервером.Таким образом, класс, отмеченный [DataContract], будет иметь методы (поведение) и [DataMember] поля / свойства (состояние).

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

4 голосов
/ 17 сентября 2010

DTO, которые оформлены как классы DataContract , являются реальными объектами.У них могут быть методы, , но методы не являются частью процесса сериализации .

Основное время, которое вызывает проблемы, это:

  • вы полагаетесь на сгенерированную прокси-версию объектов DataContract (например, когда у вас есть клиент Silverlight, вызывающий службу WCF, или вы вызываете стороннюю службу, у которой нет доступа к коду или его библиотекам).Сгенерированные версии прокси не будут содержать методов, только свойства DataMember.Способ обойти это - использовать объекты из общей библиотеки (как уже упоминалось @Insomniac).

  • ваши свойства в объектах DataContract - это больше, чем просто get / setоперация, т.е. вы, возможно, включили некоторую логику для выполнения других операций, когда установлено значение свойства.В этом случае даже в сгенерированной прокси версии эта логика не будет включена.Чтобы обойти это, нужно либо иметь общую библиотеку, либо иметь частичный класс на стороне клиента, который расширяет сгенерированный прокси-класс.

0 голосов
/ 17 сентября 2010

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

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

0 голосов
/ 17 сентября 2010

Обмен вашими классами между клиентскими и серверными проектами - путь. Не забудьте проверить в справочнике службы, что он пытается повторно использовать типы в ссылочных сборках. Таким образом, ссылка на службу не будет генерировать прокси-классы для общих объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...