WCF - управление версиями
Если мне нужно выйти из этого контракта на обслуживание:
[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 ответа
Согласно связанной статье вы должны сделать что-то вроде:
[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IServiceNew : IService1
{
[OperationContract(Name = "AddCustomerNew")]
bool AddCustomer(DTOCustomer2 customer);
}
Затем реализуйте это в вашем сервисе:
public class MyCurrentServiceImplementation : IServiceNew
{...}
Вам нужно будет повторно развернуть службу, но существующие клиенты должны иметь возможность продолжать вызывать операцию AddCustomer, а новые клиенты могут вызывать операцию AddCustomerNew.
Очень важно отметить, что предположение, которое вы изложите в своем посте:
"Когда контракт данных изменяется, необходимо определить новый контракт контракта данных в новом пространстве имен"
это не всегда так. См. "Управление версиями контракта данных" в MSDN для ряда случаев, когда изменение контракта данных не нарушается и поэтому может не потребовать никаких действий, кроме как, возможно, изменения внутренней реализации вашего метода обслуживания для обработки наличия / отсутствия определенных данных из-за различия между версиями контракта данных.
В этом конкретном примере я хотел бы спросить, как две версии метода называется AddCustomer
может сильно различаться по своему замыслу, что оправдывает создание нового интерфейса службы. Не видя ваших старых и новых контрактов на данные, я не могу знать наверняка, но я предполагаю, что реальная проблема заключается в том, что метод эволюционировал, чтобы принимать дополнительную информацию о клиентах.
Если это так, то это очень похоже на ситуацию необязательных аргументов в вызове метода. WCF разработан для того, чтобы очень хорошо справляться с этим сценарием как неразрывное изменение контракта на данные. Если вы можете следовать рекомендациям, приведенным в разделе "Лучшие практики: создание версий контракта данных" на MSDN, то вызовы, предоставляющие либо старую, либо новую версию контракта, будут нормально приниматься вашим существующим интерфейсом службы. Ваш сервисный метод получит данные, которые возможны, учитывая комбинацию контрактов данных клиента и сервера.
Я хотел бы, чтобы мой интерфейс службы был последовательным, простым и чистым (т.е. избегать таких вещей, как IServiceNew), и вместо этого просто добавить к контракту на данные и изменить реализацию AddCustomer
адаптироваться к любым данным, которые он получает.