Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NETMVC:如何从控制器创建表单?_.net_Winforms_Model View Controller_Design Patterns - Fatal编程技术网

.NETMVC:如何从控制器创建表单?

.NETMVC:如何从控制器创建表单?,.net,winforms,model-view-controller,design-patterns,.net,Winforms,Model View Controller,Design Patterns,在.NET3.5WinForms中,我创建了一个MVC。我想把控制器部分放到一个单独的组件中,这样它就不知道视图了。我的应用程序在其视图中使用了五种形式。控制器负责在不同的时间初始化表单,这意味着控制器有一个对视图的引用(我不希望这样)。这意味着控制器不能分离,因为它需要知道正在创建的表单类型,这可能意味着它不是真正的控制器 您可以在视图和模型之间使用主题观察者模式来解耦视图和模型之间的交互。 此外,您还可以使用MVP模式。我可以在控制器中声明表单变量。与景色无关。这些是System.Windo

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

您可以在视图和模型之间使用主题观察者模式来解耦视图和模型之间的交互。
此外,您还可以使用MVP模式。

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

我使用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 )
    {
    }
}
公共类MainWindowController:WindowController
{
}
公共类WindowController,其中TView:IView
{
公共窗口控制器(IViewFactory工厂){}
public void ShowWindow(){}
public void CloseWindow(){}
}
公共接口IViewFactory
{
IView CreateWithController(IWindowController控制器){}
}
公共接口IView{}
公共界面IMainWindowView:IView{}
公共类主窗体:窗体,IMainWindowView
{
公共主窗体(IWindowController windowController)
{
}
}
我的窗口控制器类依赖于视图工厂,它将创建已注册视图的实例(使用容器)

ViewFactory使用IOC容器创建临时视图,并将控制器实例注入构造函数

它还有ShowWindow和CloseWindow等方法来显示和隐藏表单。这允许我使用模拟视图对控制器进行单元测试。它还从我的控制器和模型代码中删除了对Windows窗体的任何依赖,允许我将来用WPF视图替换任何视图


我设置我的主要应用程序逻辑、视图接口、控制器和模型位于一个主程序集中,而另一个程序集中只包含Windows窗体和控件

谢谢。什么是主应用程序日志?这是您的UI吗?这将是主程序集中的主要应用程序逻辑(控制器、模型、服务等),另一个包含windows窗体控件。