Это вполне приемлемо, возможно, даже стандарт.
(public/private) static final TYPE NAME = VALUE;
где TYPE
- это тип, NAME
- это имя во всех заглавных буквах с подчеркиванием для пробелов, а VALUE
- это постоянное значение;
Я настоятельно рекомендую НЕ ставить ваши константы в своих собственных классах или интерфейсах.
В качестве примечания: переменные, объявленные как final и изменяемые, все еще могут быть изменены; однако переменная никогда не может указывать на другой объект.
Например:
public static final Point ORIGIN = new Point(0,0);
public static void main(String[] args){
ORIGIN.x = 3;
}
Это законно, и тогда ORIGIN
будет точкой в (3, 0).
WSCF предоставляет инструмент, ориентированный на контракт, с интеграцией VS. Касса. (бесплатно)
По состоянию на 6 июля есть двоичный выпуск с программой установки.
Я предпочитаю разработку по контракту. Для этой цели я использовал сервисную фабрику . Это позволило мне сгенерировать как сервисный, так и клиентский код без настройки.
С помощью настройки мы также смогли сгенерировать объекты передачи данных, соответствующие объектам Entity Framework, а также код для перевода из одного в другой; автоматическая регистрация исключений; и HTML-документация служб.
Это дополнение к правилам анализа кода, которые поставляются с Service Factory, которые помогают не дать разработчику выстрелить себе в ногу, выбрав несовместимые параметры WCF.
То, как мы это делаем, описано в этом видео:
http://www.dnrtv.com/default.aspx?showNum=103
Идея в том, что мы делаем не использовать генерацию кода, поэтому нам не нужно повторно создавать код при изменении контракта.
Контракт находится в коде и может быть изменен, если есть несоответствие между клиентом и сервером, это будет отображаться в ошибке сборки .
Я использую подход «сначала контракт», обычно (но не всегда) с использованием одного и того же представления типа на каждом конце.
На самом деле, чтобы использовать 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 - это реализация "буферов протокола" Google. API, в котором есть 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; Я работаю именно над этим ( доказательство ).
который имеет 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; Я работаю именно над этим ( доказательство ).
который имеет 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; Я работаю именно над этим ( доказательство ).
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; Я работаю именно над этим ( доказательство ).
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; Я работаю именно над этим ( доказательство ).
d необходимо проверить VB) - это создать полную реализацию прокси-сервера WCF (с вашим выбором методов синхронизации или асинхронности); очень похож на svcutil, но (из-за связи protobuf-net) он включает настраиваемый атрибут [ProtoBehavior]
в контрактах операций, так что он использует сериализатор protobuf-net вместо DataContractSerializer
(быстрее и эффективнее, но по-другому)
Для интеграции с VS; Я работаю именно над этим ( доказательство ).
d необходимо проверить VB) - это создать полную реализацию прокси-сервера WCF (с вашим выбором методов синхронизации или асинхронности); очень похож на svcutil, но (из-за связи protobuf-net) он включает настраиваемый атрибут [ProtoBehavior]
в контрактах операций, так что он использует сериализатор protobuf-net вместо DataContractSerializer
(быстрее и эффективнее, но по-другому)
Для интеграции с VS; Я работаю именно над этим ( доказательство ).
но разные).Для интеграции VS; Я работаю именно над этим ( доказательство ).
но разные).Для интеграции VS; Я работаю именно над этим ( доказательство ).
В WCF есть некоторое разнообразие в том, как выглядит «сначала контракт». Вы можете создать «сначала кодовый контракт», в котором ваши данные и контракты службы выражаются как типы .NET с правильной разметкой атрибутов. Вы можете начать с WSDL и создать контракты службы и данных или начать со схемы XML для своего контракта данных и выразить контракт службы в виде кода. Какой путь вы выберете, действительно зависит от характера контракта и того, как он будет использоваться.
Если вы реализуете что-то в спецификации WSDL, генерация кода из WSDL - очевидный выбор, а генерация вручную - не такая уж и сложная задача. большое дело. Вы можете инициировать генерацию из события сборки проекта (или войти в msbuild), если хотите, чтобы изменения в файле WSDL распространялись немедленно.
Если у вас есть существующая схема (XSD), которую вы хотите использовать в качестве контракта данных, или вы предпочитаете разработать свой контракт данных таким образом, чтобы упростить повторное использование на других платформах, вы можете сгенерировать типы из схемы с помощью xsd.exe ( или сторонняя альтернатива). В этом случае вы должны использовать свои XML-сериализуемые типы в контракте службы, ориентированной на код, например this :.
Если вы сами разрабатываете клиенты и серверы в .NET, и ваши клиенты могут либо получите свои сборки контрактов, либо с радостью создадите клиентов из метаданных службы (например, WSDL), моделирование ваших контрактов в коде - отличный опыт. Используя схему «известных типов», вы можете поддерживать модели наследования в своем контракте данных, что может быть очень мощным. Вы можете полностью пропустить создание клиентского кода (как упоминалось в других ответах), напрямую сославшись на сборку контракта в вашем клиенте. Это очень продуктивно и элегантно, но вы должны знать, что вы можете создать проблемы взаимодействия, если будете слишком изобретательны.