Контракт-Первая SOA с WCF - PullRequest
12 голосов
/ 26 июня 2009

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

Мои вопросы следующие:

  1. Как вы подходите к проектированию первоклассных услуг с .NET и WCF?
  2. Существуют ли другие инструменты, кроме svcutil, которые могут генерировать как клиента, так и сервис из контракта? (Все, что интегрируется с VS было бы идеально)
  3. С какими профессионалами в реальном мире вы столкнулись с дизайном первого контракта и wCF?
  4. С какими реальными минусами вы столкнулись с дизайном первого контракта и WCF?

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

EDIT:

В то время как WCSF решил мои насущные потребности, изучение буферов протокола и Service Factory являются интригующими инструментами, которые, я уверен, помогут мне в будущем.

Ответы [ 5 ]

15 голосов
/ 02 июля 2009

WSCF предоставляет инструмент для контракта с интеграцией VS. CheckItOut. (Бесплатно)

По состоянию на 6 июля, есть бинарный релиз с программой установки.

5 голосов
/ 02 июля 2009

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

На самом деле, для использования WCF вам не нужны специальные прокси и т. Д .; вы можете использовать ваши обычные типы .NET с обоих концов и не использовать svcutil.exe вообще . Получить работающий сервис так же просто, как добавить «ABC» в файл конфигурации и использовать что-то вроде:

public sealed class WcfClient<T> : System.ServiceModel.ClientBase<T>
    where T : class
{
    public T Service { get { return base.Channel; } }
}

Теперь вы можете использовать:

using(var client = new WcfClient<IMyService>()) {
    int i = client.Service.SomeMethod("abc");
}

и все, что у вас есть на клиенте (и сервере), это ваш IMyService интерфейс.


Для других инструментов; protobuf-net - это реализация API Google «протокольные буферы», который имеет DSL для описания данных и сервисов «первым по контракту» (и переносимым / совместимым) способом, например (файл .proto):

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}
message SearchResponse {
  repeated string result = 1; 
}
service SearchService {
  rpc Search (SearchRequest) returns (SearchResponse);
}

Инструмент protobuf-net (который я поддерживаю) включает утилиту "protogen" для преобразования этого DSL в C # / VB; и один из вариантов (по крайней мере, для C # - мне нужно проверить VB) - создать полную реализацию прокси WCF (с вашим выбором методов синхронизации или асинхронности); очень похоже на svcutil - но (из-за отношения protobuf-net) он включает в себя пользовательский атрибут [ProtoBehavior] в контрактах операций, так что он использует сериализатор protobuf-net вместо DataContractSerializer (быстрее и эффективнее, но отличается ).

Для интеграции VS; Я работаю именно над этим ( доказательство ).

3 голосов
/ 26 июня 2009

Я предпочитаю контрактную разработку. Для этой цели я использовал Service Factory . Это позволило мне сгенерировать как сервисный, так и клиентский код без настройки.

Благодаря настройке мы также смогли генерировать объекты передачи данных, соответствующие объектам Entity Framework, вместе с кодом для перевода из одного в другой; автоматическая регистрация исключений; и HTML документация услуг.

Это дополнение к правилам анализа кода, поставляемым с Service Factory, которые помогают разработчику избежать попадания в ногу, выбрав несовместимые опции WCF.

2 голосов
/ 02 декабря 2009

В WCF у вас есть некоторое разнообразие в том, как выглядит «сначала контракт». Вы можете заключить «кодовый контракт первым», где ваши контракты на данные и услуги выражаются в виде .NET с правильной разметкой атрибута. Вы можете начать с WSDL и сгенерировать контракты на обслуживание и данные или начать с схемы XML для своего контракта на данные и выразить контракт на обслуживание в виде кода. Какой путь вы выберете, зависит от характера контракта и способа его использования.

Если вы реализуете что-то в спецификации WSDL, то выбор кода из WSDL - очевидный выбор, и генерация вручную не такая уж большая проблема. Вы можете запустить генерацию из события сборки проекта (или войти в msbuild), если хотите, чтобы изменения в файле WSDL распространялись немедленно.

Если у вас есть существующая схема (XSD), которую вы хотите использовать в качестве контракта данных, или предпочитаете разрабатывать свой контракт данных таким образом, чтобы упростить его повторное использование на других платформах, вы можете генерировать типы из схемы с помощью xsd.exe ( или сторонняя альтернатива). В этом случае вы должны использовать ваши XML-сериализуемые типы в контракте на обслуживание кода, например this :.

Если вы сами разрабатываете клиенты и серверы в .NET, и ваши клиенты могут либо получать ваши контрактные сборки, либо счастливы, генерируя клиентов из метаданных сервисов (например, WSDL), моделирование ваших контрактов в коде - отличный опыт. Используя схему «известных типов», вы можете поддерживать модели наследования в вашем контракте данных, что может быть очень мощным. Вы можете полностью пропустить создание клиентского кода (как упоминалось в других ответах), напрямую ссылаясь на сборку контракта в вашем клиенте. Это очень продуктивно и элегантно, но вы должны знать, что вы можете создавать проблемы взаимодействия, если вам это слишком нравится.

0 голосов
/ 06 июля 2009

Как мы это делаем, описано в этом видео:

http://www.dnrtv.com/default.aspx?showNum=103

Идея состоит в том, что мы не используем генерацию кода, поэтому мы избегаем необходимости повторной генерации кода при изменении контракта.

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

...