Я использую подход сначала контракта, обычно (но не всегда), используя одинаковое представление типов на каждом конце.
На самом деле, для использования 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; Я работаю именно над этим ( доказательство ).