Проблема с WCF и несколькими пространствами имен - совместное использование типов объектов для нескольких ссылок на службы - PullRequest
5 голосов
/ 10 января 2010

У меня есть два веб-сервиса. Один с пользовательскими функциями, другой с функциями администратора.

Обе службы эффективно работают с одними и теми же типами объектов, например:

  • AdminService предоставляет функциональность для удаления / изменения объектов Customer
  • UserService предоставляет функциональность для перечисления / чтения объектов Customer

Теперь в клиенте у меня есть две ссылки на службы, Webservices.Admin и Webservices.User.

Если я использую UserService для извлечения объектов Customer, я не могу управлять ими через AdminService, поскольку UserService извлекает объекты типа Webservices.User.Customer, однако AdminService работает с объектами типа Webservices.Admin.Customer.

На стороне сервера оба типа идентичны, просто принадлежат разным пространствам имен в клиенте.

Теперь вопрос: как я могу делиться типами по разным ссылкам на услуги?

Ответы [ 4 ]

2 голосов
/ 27 сентября 2011

Выезд http://cgeers.com/2011/07/31/wcf-sharing-types-using-svcmap/ Изменяя файл Reference.svcmap, вы можете убедиться, что для каждого DataContract, используемого различными ссылками на службы, создается только один класс.

Примечание. Не забудьте удалить содержимое узла перед нажатием «Обновить справочную службу»

1 голос
/ 10 января 2010

Используйте slsvcutil для создания прокси WCF на клиентской стороне (при условии, что клиентская сторона является приложением .net), обратитесь к DLL, содержащей ваши объекты, и она будет использоваться для всех конечных точек, которые передают один и тот же объект в DLL

Откройте командную строку Visual Studio из Пуск -> Visual Studio 2008 -> Инструменты -> Командная строка Visual

Перейти к каталогу, похожему на

C: \ Program Files \ Microsoft SDKs \ Silverlight \ v3.0 \ Tools

введите slsvcutil и следуйте синтаксису

slsvcutil http://somewcfservice:8080 /r:CommonLibrary.dll

где CommonLibrary.dll - это dll, содержащая бизнес-объекты

[править] исправил тот факт, что проект является проектом Silverlight

1 голос
/ 10 января 2010

Если вы контролируете оба конца связи, и оба конца являются только .NET, вы можете сделать это:

  • поместите все ваши контракты, включая ваши контракты на передачу данных, в отдельную сборку "Контракты"
  • ссылается на эту сборку как в коде реализации на стороне сервера, так и на коде на стороне клиента

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

Это работает только , если вы контролируете оба конца провода и имеете .NET на обоих концах! Но в этом случае это отличный способ обмена контрактами, особенно контрактами на передачу данных, между сервером и любым количеством клиентов.

0 голосов
/ 19 августа 2010

Существует простой способ обмена типами между клиентом и службой, просто добавив ссылку на сборку общего типа на ваш клиент ПЕРЕД добавлением ссылки на службу.

Подробный сценарий и пример проекта можно найти там:

http://blog.walteralmeida.com/2010/08/wcf-tips-and-tricks-share-types-between-server-and-client.html

...