Настройка проекта WCF и зависимости - PullRequest
1 голос
/ 28 мая 2009

Какой самый распространенный / лучший способ настройки проекта и приложений службы WCF?

Вот пример:

  • Решение: "MyProject"
  • Библиотека классов: "MyProject.Common"
    • Содержит интерфейс ServiceContract и любые DataContracts
  • Библиотека классов: "MyProject.Impl"
    • Содержит реализацию контракта на обслуживание и класс клиента, который можно использовать для вызова службы
  • Веб-приложение службы WCF: "MyProject.Service"
    • Содержит ссылки на MyProject.Common и Impl, чтобы он мог размещать службу
    • Приложение службы WCF настроит конечные точки в web.config
  • Веб-приложение ASP.NET: "MyProject.Web"
    • Содержит ссылки на «MyProject.Common» и «MyProject.Impl», чтобы он мог использовать клиентский класс
    • Веб-приложению также необходимо настроить конечные точки в файле web.config и т. Д.

Мой вопрос заключается в том, имеет ли смысл разделять контракт и реализацию на отдельные библиотеки DLL и должны ли приложения (-и) ссылаться на библиотеки Common / Impl, или же приложения (-и) должны просто ссылаться на сервис (используя «Создать ссылку на службу» или SvcUtil). Я думаю, что для приложений может иметь смысл просто ссылаться на сервис, чтобы вы не связывали Common / Impl с приложением. В этом случае имеет ли смысл создавать клиентский класс в MyService.Impl?

Ответы [ 4 ]

5 голосов
/ 28 мая 2009

Ознакомьтесь с фабрикой программного обеспечения веб-службы . В нем много полезных рекомендаций по созданию приложений WCF, включая некоторые рекомендации по структуре решения . Кроме того, у IDesign.NET (Ювал Лоуи) есть некоторые рекомендации по этому вопросу (zip-ссылка).

1 голос
/ 28 мая 2009

Мой вопрос заключается в том, имеет ли смысл разделять контракт и реализацию на отдельные библиотеки DLL, и должно ли приложение (я) ссылаться на библиотеки Common / Impl, или же приложение (я) должно просто сделать сервис ссылка (с помощью «Создать ссылку на службу» или SvcUtil). Я думаю, что для приложений может иметь смысл просто ссылаться на сервис, чтобы вы не связывали Common / Impl с приложением. В этом случае имеет ли смысл создавать клиентский класс в MyService.Impl?

Бинго - ты "получил" это! Даже если теоретически технически может совместно использовать контракты и интерфейсы с использованием общих сборок, я бы рекомендовал не делать этого.

Прежде всего, другие клиенты (например, Java, PHP, Ruby) не смогут использовать общие сборки .NET. Поэтому внезапно они используют интерфейс, отличный от вашего клиента, что может привести к незначительным изменениям, которые трудно отладить.

Во-вторых, SOA - это разделение частей вашей системы на отдельные, отдельные объекты с четко определенными границами обслуживания. Совместное использование сборок вводит зависимости, которые вы пытаетесь избежать.

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

Марк

1 голос
/ 28 мая 2009

Это зависит.

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

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

Проблема сложных типов, на которую ссылается Хьюго, не возникнет, если вы пометите классы, которые вы используете, с помощью Data Contracts, что вы должны делать в любом случае, чтобы упростить управление версиями служб.

1 голос
/ 28 мая 2009

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

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

C: \ Samples \ WcfSerialization> svcutil.exe /out:WcfServiceProxy.cs / d: Schmu rgon.WcfClient.Web /r:Schmurgon.Data.Contracts\Schmurgon.Data.Contracts\bin\debu g \ Schmurgon.Data.Contracts.dll http://localhost:5150/Schmurgon.WcfService.Host/S ervice.svc? * 1007 WSDL *

Переключатели:

/ out: param - это просто имя выходного прокси-класса.

/ d: каталог для хранения прокси-класса.

/ r: сборка, содержащая типы, которые в противном случае были бы включены в прокси-класс

[нет] адрес вашей службы WCF.

(Это вставлено из http://schmurgon.net/blogs/ben/archive/2006/12/17/wcf-proxy-generation-without-types.aspx)

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