Предоставление функций-членов в пользовательском классе через WCF - PullRequest
2 голосов
/ 17 апреля 2011

У меня есть несколько функций-членов в трех пользовательских классах, уже созданных в моем сервисе. Моя цель - использовать эти пользовательские классы на стороне клиента для доступа к функциям-членам в сервисе. Как мне выставить эти классы со всеми методами-членами в них клиенту?

Я создал эти три класса в своем сервисе и отметил их как «DataContract», а функции-члены как «OperationContract». Я создал интерфейс, который определяет эти пользовательские классы как OperationContracts, возвращая объект каждого из классов посредством реализации их в отдельном классе.

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

Мне нужны ваши подсказки о том, что делать.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2011

По умолчанию и по замыслу WCF будет совместно использовать контракты между клиентом и сервером, например, вашими службами ([ServiceContract]), их методами ([OperationContract]) и структурами данных, с которыми они работают ([DataContract]).

WCF - это система передачи сообщений, поэтому все клиентские и серверные ресурсы с точки зрения передаваемых данных представляют собой сериализованный формат сообщений XML.Когда вы добавляете ссылку на службу, прокси на стороне клиента будет генерировать класс для каждого [DataContract], который будет выглядеть идентично в сериализованном формате XML - только данные перемещаются назад и вперед - без поведения (нетметоды).

По сути, если вы хотите раскрыть функциональность , вам нужно иметь метод обслуживания, украшенный атрибутом [OperationContract].Методы в ваших классах данных никогда не будут видны клиенту - и это специально.

Если вы управляете обоими сторонами связи, и оба они основаны на .NET, вы можете "обмануть"Чтобы обойти это ограничение:

  • поместите все ваши контракты на обслуживание и данные в отдельную сборку библиотеки классов
  • используйте ссылку на эту общую общую сборку для создания вашего сервиса
  • до вы делаете Add Service Reference, добавьте ссылку на эту общую сборку на вашем клиенте

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

Он работает нормально в сценарии только .NET, но это действительно своего рода подвох за надлежащим сервисомразделительный фасад.

0 голосов
/ 17 апреля 2011

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

ОднакоЭто нарушает независимость реализации контракта, так как на клиенте и на сервере должна существовать одна и та же сервисная сборка, и она будет синхронизироваться при каждом изменении.

Подробнее см. здесь подробности.

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