Я использую Контейнер IOC, чтобы разрешить представление и внедрить экземпляр контроллера через конструктор формы, вот так.
public class MainWindowController : WindowController<IMainWindowView>
{
}
public class WindowController<TView> where TView : IView
{
public WindowController( IViewFactory factory ) {}
public void ShowWindow() {}
public void CloseWindow() {}
}
public interface IViewFactory
{
IView CreateWithController( IWindowController controller ) {}
}
public interface IView {}
public interface IMainWindowView : IView {}
public class MainForm : Form, IMainWindowView
{
public MainForm( IWindowController windowController )
{
}
}
Мой класс Window Controller зависит от фабрики представлений, которая будет создавать экземпляр зарегистрированного представления (используя контейнер).
ViewFactory использует контейнер IOC для создания переходных представлений и внедряет экземпляр контроллера в конструктор.
У него также есть такие методы, как ShowWindow и CloseWindow, которые будут отображать и скрывать форму. Это позволяет мне тестировать мои контроллеры с помощью фиктивных представлений. Он также удаляет любую зависимость от Windows Forms из моего контроллера и кода модели, что позволяет мне в будущем заменить любые представления представлениями WPF.
Я установил, что логика моего основного приложения, интерфейсы представления, контроллеры и модели находятся внутри одной главной сборки, а другая сборка содержит только формы и элементы управления Windows Forms.