DataContract データコントラクト ~ ユーザー定義型の利用
ここでは WCF でウェブサービスを開発しているときに、ユーザー定義型を利用する方法を説明します。 ユーザー定義型、というのは、あなたが(好き勝手に)定義するクラスなどのデータ構造のことです。 文字列や整数型などの基本的なデータ型と区別して、そう呼ばれたりします。
WCF ではサービスのインターフェイスを、サービスコントラクト (ServiceContract) という言い方で定義することは別の資料で説明したとおりです。 データ構造の定義はデータコントラクト (DataContract) という言い方をします。
やることはいたって単純で、クラス定義の属性として [DataContract] というのをソッとつけてあげれば OK です。
と、これだけの前置きでさっそく具体例を見ていきましょう。
using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; namespace MyHRService { [ServiceContract] public interface IEmployeeInfo { [OperationContract] Employee GetEmployee(string empID); [OperationContract] List<Employee> GetAllEmployees(); [OperationContract] void AddEmployee(Employee employee); [OperationContract] void RemoveEmployee(string empID); } [DataContract] public class Employee { string name = ""; string empID = "00000"; [DataMember] public string Name { get { return name; } set { name = value; } } [DataMember] public string EmployeeID { get { return empID; } set { empID = value; } } } }
この例では Employee (従業員)というクラスを定義しています。WCF で利用するために、[DataContract] という属性を指定しています。
この Employee 情報をやりとりする、サービスを MyHRService (注: HR はヒューマンリソースで人事のことです)という名前空間の中に データとともに定義した、というわけです。
これに対する実装は、かなり手抜きですが、空っぽのこんなひな形で間に合わせてしまいます。(スミマセン)
using System.Collections.Generic; namespace MyHRService { public class EmployeeInfo : IEmployeeInfo { public Employee GetEmployee(string empID) { return null; } public List<Employee> GetAllEmployees() { return null; } public void AddEmployee(Employee employee) { } public void RemoveEmployee(string empID) { } } }
こうすることで、このプロキシーコードを取り込めばクライアント側で、MyHRService.Employee としてユーザー定義型が利用できます。