C# MVP中演示者的实现问题
因此..我打算使用模型视图演示器(被动模式,在这种模式下,UI非常愚蠢,将所有事件发送给演示器,演示器负责处理模型)来粘合我的域的业务逻辑和UI 我的问题是我的演示者应该是什么样子。这就是我想要的吗C# MVP中演示者的实现问题,c#,.net,oop,mvp,C#,.net,Oop,Mvp,因此..我打算使用模型视图演示器(被动模式,在这种模式下,UI非常愚蠢,将所有事件发送给演示器,演示器负责处理模型)来粘合我的域的业务逻辑和UI 我的问题是我的演示者应该是什么样子。这就是我想要的吗 public class TicTacToeGamePresenter { private readonly ITicTacToeView view; private readonly PlayerController model; public TicTacToeGame
public class TicTacToeGamePresenter
{
private readonly ITicTacToeView view;
private readonly PlayerController model;
public TicTacToeGamePresenter(ITicTacToeView view) {
this.view = view;
}
...
}
我是否应该通过构造函数注入传递预期的ITicTacToeView
的实例?这将允许我将这个tictactoegamepender
类与表单、WPF、WebForms等一起使用。我只需要确保我的视图实现itictaoeview
接口
或者我应该实例化我想要直接使用的具体类,并且只使用一个无参数构造函数吗?这似乎有点毫无意义,但我不得不问:(
我目前将ITicTacToeView
接口定义为:
public interface ITicTacToePassiveView
{
event EventHandler<EventArgs<Point>> ButtonClicked;
void PlayerOPlayed(Point location);
void PlayerXPlayed(Point location);
void EnableStartButton();
void DisableStartButton();
}
现在,在看了代码之后,我认为也许最好通过赋予“高于类”类实例化的责任,使这个“类依赖关系”更加明确:
public TicTacToeGamePresenter(ITicTacToePassiveView view, IPlayer playerO, IPlayer playerX, Game game, PlayerController playerOModel, PlayerController playerXModel)
{
this.view = view;
this.playerO = playerO;
this.playerX = playerX;
this.game = game;
this.playerOModel = playerOModel;
this.playerXModel = playerXModel;
}
哪一个更好?
谢谢我同意您的第一个选择:使用构造函数将视图注入演示者,因为这将允许您支持不同类型的UI,前提是它们都实现了界面 另外,从单元测试的角度来看,您的生活会简单得多,因为任何实现该接口的模拟类都可以用于您的测试 编辑:添加了WCSF的代码示例 WCSF使用依赖项注入,每个视图都有一个用于演示者的属性,该属性被注入到视图中。这同样有效,不需要构造函数方法,但需要公开一个公共视图属性
[CreateNew]
public DefaultViewPresenter Presenter
{
set
{
this._presenter = value;
this._presenter.View = this;
}
}
我认为除了使用构造函数(或参数)注入,您没有太多选择 在运行时,当视图的演示者第一次实例化时,视图将已经实例化;如果在演示者中创建视图,则将使用视图的单独实例,并且不会处理任何预期事件
如果您使用的是创建演示者,我倾向于使用第二种方法来创建您的构造函数。如果您没有,那么您要求视图代表演示者实例化iPlayer、PlayerController和游戏,它可能不知道如何创建演示者。有关为什么要使用IoC容器的一些讨论,我将我通常会开始使用IoC容器。但是现在我已经有很多东西需要学习,而且它们本身已经造成了足够的破坏。顺便说一句,你链接的帖子看起来不错。还有一个问题,你说过了“在运行时,当视图的演示者第一次实例化时,视图已被实例化;如果您在演示者中创建视图,则您将使用视图的单独实例,并且不会处理任何预期事件。"。难道我不能在演示者中实例化视图吗?这样,视图将只在演示者之后实例化。或者我缺少什么吗?当演示者处理交互、实例化视图并返回这些视图的实例时,您使用的是MVC,而不是MVP。假设ASP.NET Webforms,MVP不允许您短路请求视图(页面)的第一步。让我们试着澄清一下。在MVP中,视图和模型彼此屏蔽,在它们之间有演示者,处理所有交互,对吗?在MVC中,这不是真的,因为视图可以看到模型。
[CreateNew]
public DefaultViewPresenter Presenter
{
set
{
this._presenter = value;
this._presenter.View = this;
}
}