Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVP中演示者的实现问题_C#_.net_Oop_Mvp - Fatal编程技术网

C# MVP中演示者的实现问题

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

因此..我打算使用模型视图演示器(被动模式,在这种模式下,UI非常愚蠢,将所有事件发送给演示器,演示器负责处理模型)来粘合我的域的业务逻辑和UI

我的问题是我的演示者应该是什么样子。这就是我想要的吗

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;
    }
}