2016-04-29 9 views
0

В настоящее время я пытаюсь изменить существующий проект Windows Forms, чтобы лучше соответствовать принципам SOLID. В настоящее время существует основной класс, который инициализирует форму, и вся логика затем обрабатывается в логическом классе.Сопряжение класса 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

Вы имеете право идею. Это не так сложно, как вы думаете. Идея, лежащая в основе используемой вами методологии, заключается в том, что при необходимости вы можете заменить пользовательский интерфейс и по-прежнему иметь одну и ту же логику в фоновом режиме. Единственное, что я рекомендовал бы сделать, чтобы немного более слабо связанный был бы, как вы сказали, пусть какой-либо из ваших элементов управления обновит источник на стороне пользовательского интерфейса. Например, RefreshData может вернуть набор данных, а не устанавливать его в этом методе. И ваш метод формы может установить источник данных. Таким образом, ваша логика всегда возвращает набор данных и не заботится об пользовательском интерфейсе – oppassum

ответ

1

Более ясный способ, который я видел до сих пор в окнах, использует шаблон 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); 
    } 
}