因此,我打算使用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/

10-09 15:58