在c#.net中使用MVC的循环依赖关系

本文关键字:循环 依赖 关系 MVC net | 更新日期: 2023-09-27 18:24:54

我的解决方案中有4个项目。

  • sol型号(无参考)
  • sol控制器(参考型号)
  • sol视图(参考控制器和型号)
  • sol程序(参考视图/控制器/模型)

我的问题是:我的模型(或者我的控制器,不管怎样,问题都是一样的)必须包含一些"Form Class"(来自sol-View),而我的控制器必须在执行过程中加载/showDialog()。

但我的所有形式都包含在sol-View中,而sol-Modelsol-Controller中没有引用。由于循环依赖关系,我无法引用它。

这样做的正确解决方案是什么?

在c#.net中使用MVC的循环依赖关系

如果so-ModelForms依赖于sol-View,则:

  1. Forms依赖项提取到一个单独的项目中,所有项目都可以引用该项目
  2. 通过将Model、View和Controller类保留在同一项目中来降低复杂性

选项2是典型的MVC方法,可能更易于管理。随着应用程序的发展,您可以开始将依赖项提取到单独的项目中。

Finnaly我找到了一个尊重循环mvc依赖关系的方法,所以我接受Metro的答案(无论如何,我终于重新组织了我的项目),但这是一种接口方式。但它非常乏味。

控制器项目

public interface IMyView
{
    void SetController(MyModelController controller);
    void showDialog();
    Label getLabel1();
    // etc.
}
public class MyModelController
{
    protected IMyView _myView;
    private MyModel _myModel;
    public MyModelController(IMyView view, MyModel mm)
    {
        _myView= view;
        _MyModel = mm;
        view.SetController(this);
    }
    public void myMethod()
    {
      // now i can interact with the view provided my functions are in IMyView
      _myView.showDialog();
      _myView.getLabel1(); // etc.
    }
}

查看项目

public partial class MyView : Form, IMyView
{
    private MyModelController _controller;
    public void SetController(MyModelController controller)
    {
        _controller = controller;
    }
    public void showDialog()
    {
         this.ShowDialog();
    }
    public Label getLabel1()
    {
        return this._label1;
    }
}

INIT

MyView view = new MyView();
MyModel model = new MyModel();
MyModelController controller = new MyModelController(view,model);