WCF - управление версиями - PullRequest
       40

WCF - управление версиями

4 голосов
/ 10 января 2012

Если мне нужно выйти из этого сервисного контракта:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer1 customer);
}

к этому:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer2 customer);
}

и в соответствии с этой хорошей статьей: Управление версиями WCF Я понимаю, что при изменении контракта данных необходимо определить новый или контракт данных в новом пространстве имен, а затем определить новый контракт контракта на обслуживание. в новом пространстве имен, после чего должна быть добавлена ​​новая конечная точка.

Как именно я должен это сделать? Есть ли где-нибудь пример? Не могли бы вы написать что-нибудь на основании моего контракта на обслуживание, показанного выше?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Согласно связанной статье вы должны сделать что-то вроде:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IServiceNew : IService1
{
   [OperationContract(Name = "AddCustomerNew")]
   bool AddCustomer(DTOCustomer2 customer);
}

Тогда внедрите это в свои услуги:

public class MyCurrentServiceImplementation : IServiceNew 
{...}

Вам потребуется повторно развернуть службу, но существующие клиенты должны иметь возможность продолжать вызывать операцию AddCustomer , а новые клиенты могут вызывать операцию AddCustomerNew .

3 голосов
/ 14 сентября 2012

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

"при изменении контракта данных необходимо определить новый или контракт контракта данных в новом пространстве имен"

не всегда верно.См. «Создание версий контракта данных» на MSDN для ряда случаев, когда изменение контракта на данные не нарушает и, следовательно, может не требовать никаких действий, кроме, возможно, изменения внутренней реализации вашей службы.метод для обработки наличия / отсутствия определенных данных из-за различий между версиями контракта данных.

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

Если это правда, то этоочень похоже на ситуацию необязательных аргументов в вызове метода.WCF разработан для того, чтобы очень хорошо справляться с этим сценарием как неразрывное изменение контракта на данные.Если вы можете следовать рекомендациям, изложенным в «Наилучшие практики: управление версиями контракта данных» на MSDN, то вызовы, поставляющие либо старую, либо новую версию контракта, будут прекрасно приниматься вашим существующим Сервисный интерфейс.Ваш сервисный метод получит данные, которые возможны, учитывая комбинацию контрактов данных клиента и сервера.

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

...