在c#.net中使用MVC的循环依赖关系
本文关键字:循环 依赖 关系 MVC net | 更新日期: 2023-09-27 18:24:54
我的解决方案中有4个项目。
- sol型号(无参考)
- sol控制器(参考型号)
- sol视图(参考控制器和型号)
- sol程序(参考视图/控制器/模型)
我的问题是:我的模型(或者我的控制器,不管怎样,问题都是一样的)必须包含一些"Form Class"(来自sol-View
),而我的控制器必须在执行过程中加载/showDialog()。
但我的所有形式都包含在sol-View
中,而sol-Model
和sol-Controller
中没有引用。由于循环依赖关系,我无法引用它。
这样做的正确解决方案是什么?
如果so-Model
对Forms
依赖于sol-View
,则:
- 将
Forms
依赖项提取到一个单独的项目中,所有项目都可以引用该项目 - 通过将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);