Несколько контрактов WCF - PullRequest
4 голосов
/ 25 июня 2011

Могу ли я получить некоторые разъяснения по сложному сервису WCF, который выставляет мои бизнес-объекты. Допустим, у меня есть 4 объекта: contact, organisation, project и letter.

Лучший способ создать мой сервис:

  1. Сделать 4 контракта в качестве «сервисных объектов» и передать объект и предполагаемую операцию в качестве значений / параметров в «сервисном объекте»? или
  2. Создать контракты для всех объектов и их функций (которых может быть много)?

Большое спасибо,

Chris

Ответы [ 2 ]

8 голосов
/ 25 июня 2011

В соответствии с Принципом разделения интерфейсов , вы можете подумать о разделении этих вещей.

Один типичный подход - иметь один интерфейс (например, один "сервис") для объектатип - например, один интерфейс для Contact со всеми необходимыми операциями и полезными для контактов и т. д.

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

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

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

Обновление:

если ваш класс реализации сервиса реализует четыре контракта на обслуживание, вам придется настроить его следующим образом:

<services>
  <service name="YourNamespace.YourServiceImplementation">
     <host>
        <baseAddresses>
            <add baseAddress="http://YourServer/MyServices/" />
        </baseAddresses>
     </host>
     <endpoint name="Contact"
         address="Contact"
         binding="basicHttpBinding"
         contract="YourNamespace.IContactService" />
     <endpoint name="Letter"
         address="Letter"
         binding="basicHttpBinding"
         contract="YourNamespace.ILetterService" />
     <endpoint name="Organisation"
         address="Organisation"
         binding="basicHttpBinding"
         contract="YourNamespace.IOrganisationService" />
     <endpoint name="Project"
         address="Project"
         binding="basicHttpBinding"
         contract="YourNamespace.IProjectService" />
     <endpoint name="mex"
         address="mex"
         binding="mexHttpBinding" 
         contract="IMetadataExchange" />
  </service>
</services>

Теперь каждая из ваших услуг доступна в определенной конечной точке:

  • ваш IContractService доступен в http://YourServer/MyServices/Contact
  • ваш ILetterService доступен в http://YourServer/MyServices/Letter

и так далее ...

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

1 голос
/ 01 июля 2012

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

[ServiceContract(Name="Contact", Namespace="YourNamespace.IContactService")]
public interface IContractService
{
   ...
}

Аналогично для других интерфейсов

[ServiceContract(Name="Letter", Namespace="YourNamespace.ILetterService")]
public interface ILetterService
{
   ...
}

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

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