Вопрос реализации Ведущего в MVP - PullRequest
2 голосов
/ 14 августа 2010

Итак. Я намерен использовать Presenter Model Viewer («пассивный» режим, в котором пользовательский интерфейс довольно тупой и отправляет все события Presenter, а 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;
    }

Какой из них будет лучше? Спасибо

Ответы [ 2 ]

1 голос
/ 14 августа 2010

Я не думаю, что у вас есть большой выбор, НО использовать инъекцию конструктора (или параметра).

Во время выполнения ваше представление уже будет создано, когда его экземпляр впервые будет создан;если вы создадите представление в докладчике, то вы будете работать с отдельным экземпляром своего представления, и ни одно из ожидаемых вами событий не будет обработано.


Если вы используете IoC контейнер для создания вашего докладчика, я бы предпочел второй подход к вашему конструктору.Если это не так, то вы просите ваше мнение создать экземпляры IPlayers, PlayerControllers и Games от имени докладчика, и он, вероятно, не должен знать, как это сделать. Посмотрите здесь , чтобы обсудить, почему вы хотите использовать контейнер IoC.

1 голос
/ 14 августа 2010

Я бы выбрал ваш первый вариант: использование конструктора для внедрения представления в презентатор, поскольку это позволит вам поддерживать различные типы пользовательского интерфейса при условии, что все они реализуют интерфейс.

Кроме того, с точки зрения модульного тестирования ваша жизнь будет намного проще, поскольку любой тестовый класс, реализующий этот интерфейс, может быть использован для тестирования

РЕДАКТИРОВАТЬ: Добавлен пример кода, как WCSF это делает WCSF использует внедрение зависимостей, и каждое представление имеет свойство для презентатора, которое внедряется в представление. Это работает так же хорошо, и нет необходимости в подходе конструктора, но для этого потребуется открытое свойство View.

[CreateNew]
public DefaultViewPresenter Presenter
{
    set
    {
        this._presenter = value;
        this._presenter.View = this;
    }
}
...