F#+WCFでRESTfulなサービスをこしらえる・ServiceContract、OperationContract
残った2つのコントラクト
- 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型が暗黙的にシリアライズされる
と読めるようになりました。やったね。