読者です 読者をやめる 読者になる 読者になる

CORBAからWCFへ

CORBA WCF C#

仕事では今でもCORBAを使っているんだけど、WCFに乗り換えられないものかと検討している。*1

さすがに一気に全部置き換えるわけにもいかないので、既存の実装をうまく再利用しつつ乗り換える方法を考えている。

インタフェースの定義

まずはインタフェース定義。これは、IDLで書かれたものをContract(もしくはWSDL)に変換するだけなので、それほど大変でもないかな。

  • IDL
struct ExampleData
{
  long id;
  string message;
};
interface ExampleService
{
  void ShowMessage(in ExampleData data);
};
  • Contract
[DataContract]
public sealed class ExampleData
{
  [DataMember]
  public long Id;
  [DataMember]
  public string Message;
};

[ServiceContract]
public interface IExampleService
{
  [OperatrionContract]
  void ShowMessage(ExampleData data);
};

インスタンスモデルの違い

CORBAでは、インスタンスとアドレス(IOR)が一対一で対応している。

WCFでは、以下の3種類のインスタンスモードを指定できる。

モード名 説明
PerCall サービスを呼び出すごとにインスタンスが生成される
PerSession クライアント側でチャネルをつくるごとにインスタンスが生成される
Single サービス1つにつき、インスタンスも1つだけ生成される

CORBAと同じようにしたいのであれば、サービスの実装を以下のようにSingleモードに設定するのがよいかな。

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public ExampleServiceImple : IExampleService

WCFでは、2つのインタフェースを実装したクラスを作って、2種類のエンドポイントからアクセスするってこともできるようだ。

public ServiceImpl : IService1, IService2
ServiceHost svc = new ServiceHost(typeof(ServiceImpl), baseAddr);
svc.AddServiceEndpoint(typeof(IService1), new WSHttpBinding(), "Service1");
svc.AddServiceEndpoint(typeof(IService2), new WSHttpBinding(), "Service2");

リファレンスの受け渡し

CORBAでは以下のようなIDLを定義すれば、サービスの参照を返すサービスを作ることができる。

interface ChildService
{
};

interface ParentService
{
  ChildService GetChildService();
};

しかしWCFの場合、以下のようにはできない。(と思う)

[ServiceContract]
interface IChildService
{
};

[ServiceContract]
interface IParentService
{
  [OperationContract]
  ChildService GetChildService();
};

ContractではUriをやりとりするように定義して、UriからProxyに変換して返すようなラッパーを作ればよいだろうか。

[ServiceContract]
interface IParentService
{
  [OperationContract]
  Uri GetChildService();
};

ネーミングサービス

CORBAではオブジェクトの位置を名前で管理するための、ネーミングサービスというサービスがある。

WCFだと、同じようなものを自作すればよい?

[ServiceContract]
public interface INamingContext
{
    [OperationContract]
    void Bind(string name, Uri uri);

    [OperationContract]
    void Unbind(string name);

    [OperationContract]
    Uri Resolve(string name);

    [OperationContract]
    List<string> List();
}


いろいろ違いはあるけど、何とか乗り換えできそうな感じだ。


インサイドWindows Communication Foundation (マイクロソフト公式解説書 Microsoft Visual Studio 2008)

インサイドWindows Communication Foundation (マイクロソフト公式解説書 Microsoft Visual Studio 2008)


これからはじめるWCFプログラミング

これからはじめるWCFプログラミング

*1:Artix Connect for WCFってのもあるらしいけど、これは何者なんだろう?http://www.iona.co.jp/pressroom/2008/20080401.html