F#+WCFでRESTfulなサービスをこしらえる・ServiceContract、OperationContract

残った2つのコントラクト

WCFの持つ4つのコントラクト

  • ServiceContract
  • OperationContrace
  • MessageContract
  • DataContract

の内、MessageContract、DataContractについては既に紹介したので、今日は残った2つについて記述します。



ServiceContract について


サービスコントラクト(ServiceContract)は、サービスそのものを定義するコントラクトです。
サービスコントラクトは通常、インターフェースとして定義されることが多いようです。
インターフェースでなければならないのか、と言うと実はそうではなく、実装クラスでも定義出来るようですが、普通はインターフェースとして定義するのが一般的なようです。
サービスコントラクトにはServiceContractAttributeを付与します。

詳しいことはMSDNへ(ServiceContractAttribute Class (System.ServiceModel) | Microsoft Docs)

OperationContract について


対してオペレーションコントラクト(OperationContract)は、サービスが持つそれぞれの処理を定義するコントラクトです。
サービスコントラクトがインターフェースとして定義されるのに対して、オペレーションコントラクトはインターフェースで定義されるメソッドとして定義されることが一般的です。
オペレーションコントラクトにはOperationContractAttributeを付与します。

詳しいことはやっぱりMSDNへ(OperationContractAttribute Class (System.ServiceModel) | Microsoft Docs)

ここまでのまとめ

[<ServiceContract>]  
type IGetDataService = interface   
  [<WebGet(UriTemplate="temp/{value}/sample/{value2}")>]  
  [<OperationContract>]  
  abstract GetData7 : value:string -> value2:string -> string  


例えば上の例では、

  • サービスコントラクトとして IGetDataService メソッドを定義し、
  • IGetDataService サービス内のオペレーションコントラクトとして、GetData メソッドを定義し、
  • GetData オペレーション内のメッセージコントラクトは「二つのstring型 value, value2を持つメッセージ」(引数)、「stringを持つメッセージ」(返り値)として暗黙的に定義され、
  • メッセージが持つデータコントラクトはstring型が暗黙的にシリアライズされる


と読めるようになりました。やったね。