Как назвать несколько версий ServiceContracts в одной и той же службе WCF? - PullRequest
4 голосов
/ 26 марта 2010

Когда вам необходимо внести критическое изменение в ServiceContract, рекомендуется сохранить старое и создать новое, а также использовать некоторый идентификатор версии в пространстве имен.

Если я правильно понимаю, я смогу сделать следующее:

[ServiceContract(Namespace = "http://foo.com/2010/01/14")]
public interface IVersionedService
{
    [OperationContract]
    string WriteGreeting(Person person);
}

[ServiceContract(Name = "IVersionedService", Namespace = "http://foo.com/2010/02/21")]
public interface IVersionedService2
{
    [OperationContract(Name = "WriteGreeting")]
    Greeting WriteGreeting2(Person2 person);
}

С этим я могу создать сервис, который поддерживает обе версии. Это на самом деле работает, и выглядит хорошо при тестировании из soapUI.

Однако, когда я создаю клиента в Visual Studio с помощью «Добавить ссылку на службу», VS игнорирует пространства имен и просто видит два интерфейса с одинаковым именем. Чтобы дифференцировать их, VS добавляет «1» к имени одного из них. Я получаю прокси

ServiceReference.VersionedServiceClient

и

ServiceReference.VersionedService1Client

Теперь никому не легко увидеть, какая версия новее.

Должен ли я дать интерфейсам разные имена? * Например 1016 *

IVersionedService1
IVersionedService2

или

IVersionedService/2010/01/14
IVersionedService/2010/02/21

Разве это не противоречит цели пространства имен?

Стоит ли размещать их в разных классах обслуживания и получать уникальный URL-адрес для каждой версии?

1 Ответ

4 голосов
/ 27 марта 2010

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

Если вам нужно предложить оба интерфейса, тогда да - вам нужно сделать «магию», чтобы сделать это возможным:

  • если можете, выведите новый интерфейс из старого. Это работает, пока вы только добавляете новые вещи. Новая реализация сервиса будет реализовывать как интерфейс старого стиля, так и новый

    public interface IVersionedService2 : IVersionService1
    {
        [OperationContract(Name = "WriteNewGreeting")]
        Greeting WriteNewGreeting(Person2 person);
    }
    

    Таким образом, ваша реализация службы будет иметь как WriteGreeting, так и WriteNewGreeting метод - новые клиенты могут подключаться и использовать любой из них, в то время как старые клиенты по-прежнему будут видеть интерфейс IVersionService1 и «старое» пространство имен и, таким образом, сможете продолжать звонить в вашу службу

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...