サーバー上にあるEmployeeクラスがあり、それを Web サービスで公開して、クライアントが使用できるようにしたいと考えています。
これが私のクラスです:
public class Employee
{
public CountryCode { get; private set;}
public EmployeeType {get; set;}
public bool IsTaxable
{
get
{
return (CountryCode != Codes.CaymanIslands
&& Status != EmployeeType.Contract);
}
}
public void Employee(EmployeeType type, CountryCode code)
{
EmployeeType = type;
CountryCode = code;
}
private void Employee() {}
}
プライベート コンストラクターとプライベート セッターは、このクラスが厳密に型指定され、DRY 原則に準拠し、有効な状態でのみインスタンス化できるようにするのに役立ちます。
たとえば、IsTaxableがコンストラクターで設定されていないことを確認しますが、他のクラス プロパティに基づいて動的に評価されます。このように、EmployeeTypeが変更された場合、 IsTaxableの結果はこの変更を反映します。この単純な例を使用して、このオブジェクトがロジックに富んでいるという事実を強調します。
このEmployeeクラスがサーバー上にあり、クライアント上でアクセスしたいとしましょう。私は WebService を構築し (.NET では WCF を使用します)、クラスを公開し、すぐに使用できるツールを使用して接続し、クライアントでネットワークを介してこのクラスを使用できるようにします。
問題は、そうすると、このカプセル化されたロジックのほとんどが失われることです。受信側では、クライアントはプライベート セッター、非表示のコンストラクター、IsTaxable プロパティのロジックなどを含むこのリッチ クラスを確認できません。代わりに、クライアント側では、次のような軽量クラスが表示されます。
public class Employee
{
public CountryCode { get; private set;}
public EmployeeType {get; }
public bool IsTaxable {get; }
}
クライアントが次のようなことを行うことで、無効な状態でクラスをインスタンス化できるようになりました。
Employee e = new Employee();
e.EmployeeType = EmployeeType.Contractor;
e.IsTaxable = true;
リッチ オブジェクトの喪失は、サービス指向の生活の単なる事実であり、私たちが共に生きなければならないものなのでしょうか?
このようなサービス転送オブジェクトは、情報を送信する目的のみで弱いデータ転送エンティティと見なされ、読み取り専用である必要がありますか。
クライアント側では、(必要に応じて) これらをよりリッチなオブジェクトにラップする必要がありますか?
ロジックがそのままのリッチ オブジェクトをネットワーク経由で渡す方法はありますか、それとも本当に必要ですか?
そのようなシナリオに対処するための確立されたパターンはありますか?