Как выставить объекты через WCF? - PullRequest
3 голосов
/ 09 октября 2008

Мой проект разделен на типичную трехслойную структуру для приложения Silverlight. То есть:

  • Базовый слой, который является библиотекой классов, которая содержит все мои бизнес-объекты, логику, доступ к данным и т. Д.
  • Средний уровень, который является службой WCF, с которой связывается;
  • Мой интерфейс Silverlight

Проблема, с которой я столкнулся, заключается в том, что в настоящее время BO, предоставляемые через WCF моему пользовательскому интерфейсу, содержат только закрытые переменные и не содержат свойств или методов.

Есть ли простой способ выставить полный объект (через атрибуты или конфигурацию)?

Какое лучшее решение?

Ответы [ 4 ]

8 голосов
/ 09 октября 2008

Похоже, вы ожидаете, что внутренние классы, используемые в службе WCF, которые вы пометили как DataContracts, будут экспортированы как объекты .NET в ваш клиентский код (пользовательский интерфейс Silverlight). WCF не поддерживает эту возможность. Класс, помеченный как DataContract, - это просто структура данных без методов. Если вам нужен хороший ресурс для понимания непонятного WCF, попробуйте Изучение WCF: практическое руководство от Микеле Бустаменте .

@ Джон Фишер в общих чертах обрисовывает способ предоставления объектов .NET как клиенту, так и службе, но это не может быть вариантом для Silverlight. Вот запись в блоге , объясняющая, как получить доступ к службам на основе REST из Silverlight.

2 голосов
/ 13 октября 2008

Пометьте ваши объекты, которые используются службой, с помощью атрибутов [DataContract], а затем поместите [DataMember] в открытые свойства. Это решит вашу проблему.

1 голос
/ 09 октября 2008

ответ Sixto правильный. С помощью WCF вы можете разделить библиотеку BO между клиентом и службой и повторно использовать эти объекты (просто настройте ссылку на службу WCF таким образом), но в вашем случае это не сработает. Проблема в том, что ваш проект BO является стандартным проектом .NET, а не проектом Silverlight.

Обычно мои проекты немного отличаются от ваших:

  • Общие объекты - это будут структуры данных, размеченные атрибутами WCF, и также будут содержать любые общие интерфейсы, такие как мой интерфейс уровня данных.
  • Доступ к данным - любые объекты доступа к данным. Он ссылается только на общие объекты и возвращает их из вызовов данных.
  • Бизнес-логика (необязательно) - если есть другие веб-сервисы для взаимодействия с флешкой, которая находится в своем собственном слое
  • Сервис - Фактический сервис WCF, ссылки на Common напрямую и другие проекты через интерфейсы
  • Silverlight - справочная служба

Если вы переместили свою бизнес-логику в ее проект и просто ссылались на свои общие "тупые" объекты, то вы, вероятно, могли бы создать два логических проекта, один silverlight и один стандарт, и просто иметь фактические файлы в одном и создавать ссылки на эти файлы в другом. Таким образом вы получите одинаковую логику в обоих проектах, и она будет существовать как в Silverlight, так и в стандартном .NET.

1 голос
/ 09 октября 2008

Я сделал нечто подобное в небольшом проекте, создав dll «коммуникационный слой», который содержал только объекты, передаваемые между клиентом и сервером. Вариант этого (разделите dll между всеми проектами, нуждающимися в этих объектах) должен работать для вас. Остерегайтесь проблем с версиями, хотя. Если у вас нет полного контроля над обоими сторонами, переход на один конец может вызвать головную боль, если вы не будете осторожны.

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