因此,我打算使用Model View Presenter(“被动”模式,UI非常笨拙,并将所有事件发送给Presenter,Presenter负责处理模型)来粘合我的域业务逻辑和用户界面。
我的问题是演示者的外观如何。这就是我想要的吗?
public class TicTacToeGamePresenter
{
private readonly ITicTacToeView view;
private readonly PlayerController model;
public TicTacToeGamePresenter(ITicTacToeView view) {
this.view = view;
}
...
}
我应该通过构造函数注入传递预期的
ITicTacToeView
实例吗?这将允许我将此TicTacToeGamePresenter
类与Forms,WPF,WebForms等一起使用。我只需要确保View实现了ITicTacToeView
接口即可。还是我应该实例化打算直接使用的具体类的种类,并拥有一个无参数的构造函数?这似乎没有意义,但是我不得不问:(。
我目前将
ITicTacToeView
接口定义为:public interface ITicTacToePassiveView
{
event EventHandler<EventArgs<Point>> ButtonClicked;
void PlayerOPlayed(Point location);
void PlayerXPlayed(Point location);
void EnableStartButton();
void DisableStartButton();
}
还有一件事。在对
TicTacToeGamePresenter
的构造函数进行编码时,我最终得到以下结果:public TicTacToeGamePresenter(ITicTacToePassiveView view)
{
this.view = view;
IGameLogicAnaliser gameLogicAnaliser = new GameLogicAnaliser();
IPlayer playerO = new Player(gameLogicAnaliser);
IPlayer playerX = new Player(gameLogicAnaliser);
Game game = new Game(playerO, playerX);
this.playerOModel = new PlayerController(playerO, game);
this.playerXModel = new PlayerController(playerX, game);
}
现在,在查看了代码之后,我认为也许最好通过赋予“上方的类”类实例化的责任来使这个“类依赖”更明确:
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;
}
哪一个更好?
谢谢
最佳答案
我会选择第一个选项:使用构造函数将视图注入到Presenter中,因为只要它们都实现了接口,它将允许您支持不同类型的UI。
而且,从单元测试的角度来看,您的生活将变得更加简单,因为任何实现该接口的模拟类都可以用于测试
编辑:从WCSF如何做到这一点添加了代码示例
WCSF使用依赖项注入,每个视图都具有注入到视图中的演示者的属性。这同样有效,并且不需要构造方法,但是需要公开的View属性。
[CreateNew]
public DefaultViewPresenter Presenter
{
set
{
this._presenter = value;
this._presenter.View = this;
}
}
关于c# - MVP中主持人的实现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3483600/