2016-04-29 5 views
0

現在、SOLIDの原則をよりよく遵守するために、既存のWindowsフォームプロジェクトを変更しようとしています。現在、フォームを初期化するメインクラスがあり、すべてのロジックはロジッククラスで処理されます。C#クラスWindowsフォームとの結合

これは高い結合を生成し、すべての場所がメインフォーム上のものを変更するため、テストできません。たとえば、グリッドをリフレッシュするボタンがある場合、ロジッククラスを呼び出してデータを構築し、グリッドをリフレッシュします。以下は現在の見方の簡単な例です。

public partial class XpressReports : Form 
{ 
    private void refresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) 
    { 
     try 
     { 
      Globals.DataLogic.RefreshData(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(this, ex.Message); 
     } 
    } 
} 

public class DataLogic 
{ 
    public void RefreshData() 
    { 
     dataset selectedTableList; 

     selectedTableList = GetNonRefreshFlagColumnIdList(); 

     dataGridView.Columns.Clear(); 
     dataGridControl.DataSource = null; 
     dataGridControl.DataSource = dataViewData.Tables[0]; 
    } 
} 

このような何かのための理想的なアプローチはわかりません。私はメインフォームクラスのデータソースを更新する新しいメソッドを作成することができますが、2つの間にはまだ多くの前後があります。この種のものを分ける最善の方法は何ですか?

+2

あなたは正しい考えを持っています。これはあなたが思っているように結合されていません。使用している方法論の背後にあるアイデアは、必要に応じて、UIを交換して、バックグラウンドで同じロジックをすべて使用できるということです。私が少し疎結合させることをお勧めする唯一のことは、あなたのコントロールのいずれかがUI側でソースを更新してもらえるかのようになります。たとえば、このメソッドで設定する代わりに、RefreshDataがデータセットを返すことがあります。そして、あなたのフォームメソッドはそれからデータソースを設定することができます。そうすれば、あなたのロジックは常にデータセットを返すので、UIについては気にしません – oppassum

答えて

1

私がこれまでWindowsフォームで見たより明確な方法は、Presenteパターンを使用しています。

フォームからプレゼンターに直接電話をかけることも、プリスケーターが購読しているイベントをトリガーすることもできます。

プレゼンターはビュー(フォーム)への参照を保持し、その上で適切なメソッドを呼び出します。

プレゼンターと実際のフォームを切り離すために、ビューメソッドのインターフェイスを使用します。次の擬似コードのような

何か:

public interface IView 
{ 
    event EventHandler Initialise; 
    void SetData(MyData data) 
} 

public class Presenter 
{ 
    .... 

    public Presenter(IView view) 
    { 
     _view = view; 
     _view.Initialise += OnViewInitialise; 
    } 

    public void OnViewInitialise() 
    { 
      var data = _repository.GetData(); 
      _view.SetData(data); 
    } 
} 
関連する問題