2010-08-14 1 views
2

Итак, я намерен использовать презентацию Model View Presenter («пассивный» режим, в котором пользовательский интерфейс довольно тупой и отправляет все события в Presenter, а Presenter заботится о работа с моделью), чтобы приклеить бизнес-логику моего домена и пользовательский интерфейс.Реализация вопроса о ведущем в MVP

Мой вопрос: как должен выглядеть мой презентатор. Это то, чего я хочу?

public class TicTacToeGamePresenter 
{ 
    private readonly ITicTacToeView view; 
    private readonly PlayerController model; 

    public TicTacToeGamePresenter(ITicTacToeView view) { 
     this.view = view; 
    } 

    ... 
} 

Должен ли я инъекция конструктора передать экземпляр предполагаемого ITicTacToeView? Это позволило бы мне использовать этот класс TicTacToeGamePresenter с формами, 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; 
    } 

Какой из них лучше? Thanks

ответ

1

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

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

EDIT: Добавлен пример кода от того, как WCSF делает его WCSF использует инъекции зависимостей и каждое представление имеет свойство для презентатора, который вводится в представление. Это работает так же хорошо, и нет необходимости в конструкторском подходе, но для этого потребуется открытое свойство Public View.

1

Я не думаю, что у вас есть много выбора, но для использования инжектора конструктора (или параметра).

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


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

+0

В конечном итоге я начну использовать контейнеры IoC. Но сейчас у меня уже есть много вещей, которые я должен изучить, и вызывают достаточный хаос сами по себе. –

+0

Кстати, этот пост, который вы связали, кажется приятным. –

+0

Еще один вопрос, вы сказали, что «во время выполнения ваше представление уже создается, когда его создатель впервые создает экземпляр, если вы создаете представление в презентаторе, то вы будете работать с отдельным экземпляром вашего представления, и ни один из события, которые вы ожидаете, будут обработаны ». Не могу ли я просто создать представление в презентаторе? Таким образом, представление будет создаваться только ПОСЛЕ ПРЕДСТАВИТЕЛЯ. Или я чего-то не хватает? –