2016-04-29 25 views
0

我目前正試圖修改現有的Windows窗體項目以更好地遵守SOLID原則。目前有一個主類使得表單處於活躍狀態,然後所有的邏輯都在邏輯類中進行處理。與Windows窗體的C#類耦合

這會產生高耦合,並且不是無法測試的,因爲所有位置都會在主窗體上進行更改。例如,我有一個按鈕來刷新網格,這將調用邏輯類來構建數據,然後刷新網格。下面是它目前看起來的一個簡短例子。

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

你有正確的想法。這不像你想像的那樣耦合。你使用的方法背後的想法是,如果需要的話,你可以換出UI,並且在背景中仍然具有所有相同的邏輯。我建議讓這個更鬆散一點的東西的唯一的東西就像你說的,讓你的任何控件更新UI端的源代碼。例如,RefreshData可以返回數據集,而不是使用此方法進行設置。你的表單方法可以從中設置數據源。這樣,你的邏輯總是返回一個數據集,並不關心用戶界面 – 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); 
    } 
}