0

かなり大きくなった MainForm を使用してデスクトップ アプリケーションを開発しています。さまざまなレベル (SplitContainers、TabPages、Panels) の複数のコンテナーに多数のコントロールがあります。

ここで、データバインディングとコントロールのクリア、またはユーザー操作の実行を担当するすべてのコントローラーコードを個別のコントローラークラスに分離することにより、このクラスをリファクタリングしたいと考えています。

[編集]

目的

このアプリケーションの目的は、注文 (ジョブと呼ばれる) とその位置 (ジョブアイテムと呼ばれる) を追跡することです。各ジョブは顧客に関連し、各ジョブアイテムは記事に関連しています (ジョブアイテムには、その記事の製造プロセスに固有の情報が含まれているため、記事をラッピングしています)。Job、Joitem、Customer、および Article には、PropertyManager クラスによって管理される動的プロパティ (基本的なキーと値のペア) があります。

建築

私のアプリケーションは 2 つのメイン プロジェクトに分割されています。コアには、3 つの LinqToSQL DataContext クラスのデータ モデルが含まれています。

  • ArticleManagement
  • JobManagement
  • PropertyManagement

すべての DataContext クラスにはXyzManager、コレクション内の LinqToSQL オブジェクトを GUI に提供し、LinqToSQL データ ソースをカプセル化するクラスがあります。また、対応する DataContext タイプの作成、削除、および変更も処理します。

次に、GUI プロジェクトを作成しました。当然、メイン フォームと、オプションなどの追加フォームがいくつか含まれています。現在、私の GUI プロジェクトは、各 XyzManager クラスへの参照を保持し、Manager クラスを介してデータを取得および設定します。すべての制御ロジックを含む、ユーザー インタラクションによって指示されます。

このための独立したロジックのほとんどを、メイン フォーム クラスの外にある静的なユーティリティ クラスに入れましたが、それは理想的とは言えない方法だと思います。

[/編集]

これは私の最初の大きなデスクトップ アプリケーションであり、GUI をカプセル化するのに苦労しています。現時点では、ユーザー インタラクションの処理を担当するすべてのコントローラー コードは MainForm クラス内にあります。

MVC パターンについては知っていますが、現在のデザインで C# WinForm に適用する方法がわかりません。

私のカスタム コードだけでも 2,400 行を超える長さのコードがあり、フォームの自動生成されたコードにはカウントされず、増加傾向にあります。これをリファクタリングしたいのですが、よりエレガントな方法でこれを解決する方法がわかりません。

4

4 に答える 4

3

小規模なアプリケーションの場合は、Model-View-Presenter (MVP) を参照する必要があります。(私の意見では) MVP を実行するための最良の方法の優れたプレゼンテーションがあります: http://martinfowler.com/eaaDev/SupervisingPresenter.html

于 2009-06-24T08:00:44.513 に答える
2

通常、私はより小さな UserControls を使用して複雑な GUI を構成しようとします。ただし、いくつかの点が非常に重要です。

  • これらの UserControls はそれぞれ (特にフォームから) 独立している必要があります。
  • 特定のデータを表示または変更する目的を持つ UserControls は、このデータのみに依存する必要があります。コントロールが必要とするすべてのデータを提供する DataSource にバインドできるように、コントロールを実装するようにしてください。
  • 親コンテナー (別のユーザー コントロールまたはフォーム) に情報を渡す必要がある場合は、コンテナーがサブスクライブできるイベントを使用します。
  • (コンテキスト) メニューを使用する場合は、それらが特定の項目にバインドされているかどうかを確認してください。UserControls 内ではなく、項目の近くにメニューを作成する必要があります。そのため、GUI の異なるビュー (コントロール) で同じ項目を複数回表示する場合、すべての項目に同じコンテキスト メニューが必要です。
  • ボタン/メニューのアクションにコマンド パターンを適用してみてください。

あなたのソリューションは、今までさまざまな責任を分離できなかったように聞こえます。明確な境界線や責任を持たずに、コードをさまざまなコントロールに分割するだけでは十分ではありません。

于 2009-06-24T07:57:22.083 に答える
0

JobController を 1 つのフォームだけに使用していますか? はいの場合、部分キーワードを使用して背後のコードをいくつかのファイルに分割するだけでよいのではないでしょうか?

于 2009-06-24T08:19:03.413 に答える
0

Composite UI Application Blockを見てください。

于 2009-06-24T07:55:02.293 に答える