アプリケーション/ビジネスロジックにWCFを使用して、UIレイヤーのすべてのロジックを含むWindowsフォームアプリケーションを2層アプリケーションに変換しています。サービスのすべてのメソッドが1つのパラメーターを受け取り、1つの応答オブジェクトを返すというパターンに従っています。必要なデータはすべて、これらのオブジェクトにカプセル化されます。例えば:
public GetPersonResponse GetPerson(GetPersonRequest req){
// do stuff
}
public class GetPersonRequest{
String Name{get;set;}
Date BirthDate{get;set;}
}
public class GetPersonResponse{
Person Result {get;set;}
}
私の質問は、クライアント側のデータバインディングにあります。[データソース]と[データソースの表示]に移動すると、応答とそれらで使用されているエンティティが表示されますが、リクエストは表示されません。上記の例では、GetPersonResponseとPersonは表示されますが、GetPersonRequestは表示されません。リクエストオブジェクトをフォームにバインドし、1行のコードで操作全体を送信できると非常に便利です。
client.GetPerson((GetPersonRequest) getPersonRequestBindingSource.Current);
または少なくとも:
GetPersonRequest req = (GetPersonRequest) getPersonRequestBindingSource.Current;
Validate(req);
client.GetPerson(req);
別の例として、次のRequestクラスを持つCreatePersonメソッドを想像してください。
public class CreatePersonRequest{
String Name {get;set;}
String Address {get;set;}
String Address2 {get;set;}
String City {get;set;}
String State {get;set;}
String ZipCode {get;set;}
Integer Age {get;set;}
// more stuff here
}
次のようなコードは必要ありません。
CreatePersonRequest req = new CreatePersonRequest(){
Name = NameTextBox.Text,
Address = AddressTextBox.Text,
Address2 = Address2TextBox.Text,
City = CityTextBox.Text,
State = StateComboBox.SelectedValue,
ZipCode = ZipCodeTextBox.Text,
Age = Integer.ParseInt(AgeTextBox.Text)
}
client.CreatePerson(req);
私はむしろ持っていると思います:
client.CreatePerson((CreatePersonRequest) createPersonRequestBindingSource.Current)
私見ですが、これははるかにクリーンで保守が容易です。フィールドがリクエストに追加された場合、UIのウィジェットを更新するだけで、コード自体を変更する必要はありません。
UIデータバインディング内のデータソースによって要求が認識されるようにする方法はありますか?
クライアントとサーバーの両方で.Net4.0。
(すべてのコードは手作業で書かれているので、実行できると期待しないでください:))
編集:明確にするために、リクエストオブジェクトはコントラクトに表示されています。コードビハインドで作成して手動で入力できます。生産性を向上させるデータバインディング機能を探しているだけです。