1

Icontact と wcf サービスに 2 つのメソッドがあり、新しい要件のために 1 つのメソッドをバージョンアップしたいと考えています。既存のクライアントに古いコードを呼び出してもらいたい。下位互換性のために、変更された新しいメソッドと既存のメソッドを呼び出す新しいクライアント。

コード:

[ServiceContract(Namespace = "http://www.testk.com/1/11", Name = "cService")]
public interface ICService
{
   [OperationContract(Name="GetWorkingDetails")]
   void GetWorkingDetails(int a);

   void GetList(int a);
}

//service Implementation
public class MyService : ICService
{
   [WebGet]
   void GetWorkingDetails(int a)
   {
     ////
   }

   [WebGet]
   void GetList(int a)
   {
      ////
   }
}

ここで私はバージョン管理をしています.....

[ServiceContract(Namespace = "http://www.testk.com/2/11", Name = "cService")]
  public interface ICServicev1
{
    [OperationContract(Name="GetWorkingDetails")]
    void GetWorkingDetailsV2(int a);
}

<endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="" name="v0"
          contract="ICService" />
<endpoint address="r1" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="" name="v1"
          contract="ICServicev1" />

既存のメソッドを呼び出すと、うまく機能し、呼び出すservice.svc/r1/GetWorkingDetailsとうまく機能します。service.svc/r1/GetListしかし、私は前の契約にあるものも呼びたいです。下位互換性のためにこれを呼び出すにはどうすればよいですか。

どうも

4

1 に答える 1

0

service.svc/r1/GetListは不可能だと思います。あなたは(つまり)に継承ICServiceしていないからです。実際、次の方法でこれを実現できます。ICServicev1public interface ICServicev1 : ICService

1)メソッドICServiceCommonとのインターフェースを作成しますvoid GetList(int a);

2) and [ and ]へのICServiceCommonインターフェースを継承するICServiceICServicev1public interface ICService : ICServiceCommonpublic interface ICServicev1 : ICServiceCommon

3)クラス [ ]への実装ICServiceICServicev1インターフェース。MyServicepublic class MyService : ICService, ICServicev1

古いバージョンのクライアントは同じメソッドを呼び出します。【後方互換性】

service.svc/GetWorkingDetails
service.svc/GetList

そして新しいクライアントは呼び出すことができます

service.svc/r1/GetWorkingDetailsV2
service.svc/r1/GetList

このアプローチが役立つことを願っています。

于 2012-09-30T06:39:43.020 に答える