【问题标题】:.NET MVC: How to create form from controller?.NET MVC:如何从控制器创建表单?
【发布时间】:2009-01-26 05:29:00
【问题描述】:

在 .NET 3.5 winforms 中,我创建了一个 MVC。我想把控制器部分放到一个单独的程序集中,这样它就不知道视图了。我的应用在其视图中使用了五种形式。控制器负责在不同时间初始化表单,这意味着控制器具有对视图的引用(我不想这样做)。这意味着控制器无法分离,因为它需要知道正在创建的表单类型,这可能意味着它不是真正的控制器。

【问题讨论】:

    标签: .net winforms model-view-controller design-patterns


    【解决方案1】:

    我使用 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 窗体的任何依赖,允许我将来用 WPF 视图替换任何视图。

    我将我的主要应用程序逻辑、视图界面、控制器和模型设置在一个主程序集中,而另一个程序集仅包含 Windows 窗体窗体和控件。

    【讨论】:

    • 谢谢。什么是主应用程序日志?那是你的用户界面吗?
    • 这将是主要应用程序逻辑(控制器、模型、服务等)存在于主程序集中,另一个包含 Windows 窗体控件。
    【解决方案2】:

    您可以在视图和模型之间使用 Subject-Observer 模式来解耦视图和模型之间的交互。 此外,您还可以使用 MVP 模式。

    【讨论】:

      【解决方案3】:

      我可以在控制器中声明表单变量。与视图无关。这些是 System.Windows.Forms。当 EXE 启动时,它会初始化控制器 (Program.cs)。在那里,可以创建特定的表单,然后将其分配给控制器上的表单属性。这允许控制器被分离。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        相关资源
        最近更新 更多