部分的なクラスを使用して、WCFサービスのデータコントラクトであるクライアント側のクラスを拡張するというアイデアが好きです。しかし、私はパーティーをかなり台無しにする問題に遭遇しました。
サーバー側でクラスがあると想像してください。
[DataContract]
public class SolidObject
{
[DataMember]
public Point Position { get; set; }
[DataMember]
public Size Size { get; set; }
}
クライアント側では、プロキシクラスが生成され、ビジネスロジック層で使用されます。ビジネスロジックのニーズに応じて、次のように拡張します。
public partial class SolidObject
{
public Rect Bounds { get { return new Rect(Position.X - Size.Width / 2, Position.Y - Size.Height / 2, Size.Width, Size.Height); }}
}
ここで、PositionまたはSizeのいずれかが変更されたときに、Boundschageイベントが呼び出されるようにします。コードで簡単に実行できます。
PropertyChanged += (sender, e) =>
{
if ((e.PropertyName == "Position") || (e.PropertyName == "Size")) PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Bounds"));
};
問題は、このコードを配置するのに適した場所がどこにあるかです。
オブジェクトがサービス呼び出しによって作成されていない場合は、コンストラクターに入れます。しかし、WCFサービスはクライアント側のコンストラクターを無視します。コンストラクターがWCFクライアントに表示されない、シリアル化の問題を参照してください。。
これで、サービス応答の直後に、プログラムはデータコントラクト階層を検索し、目的のオブジェクトを取得して、イベントハンドラーを追加します。しかし、それは正しいことではないと思います。
ですから、どこでやったほうがいいのか、あるいはアプローチ全体を変えるべきだと考えているのか、興味があります。どんなアイデアでもありがたいです。