MVP Flow вопрос - PullRequest
       18

MVP Flow вопрос

2 голосов
/ 02 декабря 2010

Я реализую шаблон MVP с помощью формы Windows, и у меня есть вопрос о текущей реализации, поскольку я пытаюсь вписать это в более сложную архитектуру.Прямо сейчас у меня есть полное независимое представление со свойствами, презентатор, которому вводят представление в конструкторе, и представление, которое имеет экземпляр презентатора.Это код: Вид

public class MyView : IMyView
{
   public MyView()
   {
      var presenter = new MyPresenter(this);
      presenter.Init();
   }
}

Это Ведущий

public class MyPresenter
{
   private IMyView view;
   private MyModel model;
   //
   public MyPresenter(IMyView view)
   {
      // injection
      this.view = view;
   }
}

Таким образом, я могу выполнить две задачи:

  • Вызов методов на докладчике из представления
  • Взаимодействие с представлением из докладчика Теперь у меня есть два вопроса:
  • Для организации всего, что я использую контейнер IoC, чтобы я мог легко написать такой код:

    var view = ioc.Resolve<IMyView>();
    var presenter = ioc.Resolve<MyPresenter>(); //view injected
    NavigationService.Show(presenter.View);
    

    Пока все хорошо.

  • Первый вопрос : как я могу вернуть модель от докладчика, когда работа будет выполнена?Презентатор, используемый представлением, - это не то же самое, что я использую из контейнера IoC, поскольку представление сам по себе создает экземпляр нового презентатора ... поэтому модель, представляемая презентатором, не совпадает с моделью, используемой презентатором, созданным в представлении

  • Второй вопрос : как я могу передать существующую модель в эту триаду MVP, когда она у меня есть?Например, как я могу заставить этот код работать для Подробного представления , где Модель поступает из репозитория?

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

Для более чистого подхода введите модель и для докладчика

public class MyPresenter
{
   private IMyView view;
   private MyModel model;

   public MyPresenter(IMyView view, MyModel model)
   {
      this.view = view;
      this.model = model
   }
}

Делая это, вы всегда получаете ссылку на модель вне презентатора, где вы ее создали.

Когда вы делаете это так, вы всегда можете выбрать, какую модель вы хотите использовать. Например, если ваш Backend (ваша модель) еще не закончен, вы можете написать Mock-модель (если вы используете интерфейс для модели), чтобы проверить докладчика и ваш взгляд.

Надеюсь, это помогло

0 голосов
/ 02 декабря 2010

Исходя из этого, я буду менять все путем инвертирования зависимостей.Теперь представление не создает экземпляр презентатора, но его вводит сам презентатор следующим образом:

public MyPresenter(IView myView, Model myModel)
{
   this.View = myView;
   this.View.Presenter = this;
   this.Model = myModel;
}

Пока все хорошо.Теперь со стороны View, Presenter представлен как свойство «Только запись», поэтому его нельзя изменить с помощью View, но его можно использовать только:

public class MyView : IView
{
   public MyPresenter Presenter { get; private set; }
}

Пока все хорошо.Теперь IoC сделает это:

var view = IoC.Resolve<IView>();
var model = repository.GetModel(); // or new Model();
var presenter = IoC.Resolve<MyPresenter>(); //view and model injected
presenter.ShowView();
var result = presenter.Model;

Для меня это выглядит красиво, но я просто хочу быть уверен, что я не нарушаю логику MVP.

...