Добавление ссылок на службы для нескольких служб WCF, которые совместно используют классы - PullRequest
6 голосов
/ 20 мая 2009

Я пытаюсь разделить свои веб-сервисы WCF на несколько сервисов вместо одного гигантского сервиса. Но Visual Studio (клиент Silverlight) дублирует общие классы, общие для обеих служб. Вот простой пример, иллюстрирующий мою проблему.

В этом примере есть две службы. Оба возвращают тип «Персона». По умолчанию VS создает два отдельных прокси-сервера Person в уникальных пространствах имен. Это означает, что «Человек», возвращаемый различными службами, не может быть использован клиентом как одно и то же. Как это исправить? Возможно ли это без написания прокси-классов самостоятельно?

Общее

[DataContract]
public class Person
{
    [DataMember]
    string FirstName { get; set; }
    [DataMember]
    string LastName { get; set; }
    [DataMember]
    string PrivateData { get; set; }
}

StaffService.svc

[ServiceContract(Namespace = "")]
public class StaffService
{
     [OperationContract]
     public Person GetPerson ()
     {
         return new Person {"John", "Doe", "secret"};
     };
}

PublicService.svc

[ServiceContract(Namespace = "")]
public class PublicService
{
     [OperationContract]
     public Person GetPerson ()
     {
         return new Person {"John", "Doe", "*****"};
     };
}

Спасибо за помощь! Justin

Ответы [ 3 ]

8 голосов
/ 21 мая 2009

В разделе «Дополнительно» раздела «Добавить ссылку на службу» установлен флажок «Повторное использование типов в ссылочных сборках». Это будет искать типы, используемые в вашем сервисе, и если они уже существуют в ссылочной сборке, они будут использоваться вместо сгенерированного прокси-класса.

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

У меня обычно есть бизнес-проект / домен в моем проекте Silverlight, поэтому я добавляю свои общие классы в этот проект (обычно с помощью «Добавить существующий элемент»> «Добавить как ссылку», чтобы код был общим).

Как только это будет сделано, вы можете сгенерировать ваши сервисные ссылки, и они должны забрать ваши существующие типы.

Надеюсь, это поможет

3 голосов
/ 20 мая 2009

Если вы генерируете прокси одновременно с помощью svcutil.exe, он будет генерировать только один тип. Я не знаю, как это сделать, добавив ссылку на сервис в проект.

Мы запускаем его в пакетном файле, поэтому я сократил его и изменил имена, чтобы защитить невинных. На самом деле речь идет о сопоставлении пространств имен службы вместе, а затем , включая все URL вместе . Он также имеет установленный тип коллекции (для списков) и включает ссылку на сборку (на которую ссылаются некоторые другие ответы.

@ECHO OFF

SET cmd=C:\"Program Files"\"Microsoft SDKs"\Windows\v6.0a\bin\SvcUtil.exe
SET cmd=%cmd% /out:Traffic.cs /noConfig /collectionType:System.Collections.Generic.List`1

SET cmd=%cmd% /reference:..\..\..\lib\Architecture.Frameworks.dll

REM ######### Service namespace mappings (Service Contracts and Message Contracts)
SET cmd=%cmd% /namespace:"http://services.test.com/app/2005/09/"
SET cmd=%cmd%,"app.ServiceProxies"

REM ######### Schema namespace mappings (Data Contracts)
SET cmd=%cmd% /namespace:"http://schemas.company.com/app/2005/09/"
SET cmd=%cmd%,"Co.ServiceProxies.app.DataContracts"

REM ######### Set all the URLs that have common types
SET cmd=%cmd% http://localhost/Services/MyService1.svc
SET cmd=%cmd% http://localhost/Services/MyService2.svc

%cmd%

PAUSE

Если все элементы находятся в одном и том же пространстве имен службы, вы могли бы избежать использования всех URL-адресов и не беспокоиться о пространствах имен, но я не пробовал это таким образом.

0 голосов
/ 20 мая 2009

svcutil.exe может повторно использовать типы из указанных сборок. Это можно настроить, установив свойства справочной службы или ключ / reference, если вы запускаете svcutil.exe вручную.

Если вы являетесь владельцем указанных служб, рассмотрите возможность размещения типов данных, таких как класс Person, в отдельной сборке, доступной как для клиента, так и для службы.

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