Как не создать объект презентатора в поле зрения? - PullRequest
1 голос
/ 09 ноября 2009

В настоящее время я пробую некоторые образцы шаблонов MVP, и мне сказали не создавать конкретные Presenter объекты в View. Есть ли способ динамически создавать Presenter объекты?

public partial class View: Window, IView
{
   private Presenter _presenter;

    public View()
    {
        InitializeComponent();
        _presenter = new Presenter(this); //Asked to avoid this
    }
}

Ответы [ 2 ]

2 голосов
/ 09 ноября 2009

С помощью просмотра вначале создания вы можете использовать контейнер IoC для создания Presenter:

public View(IMyPresenter presenter)
{
    InitializeComponent();
    _presenter = presenter;
}

В качестве альтернативы, вы можете сначала использовать модель (докладчик) , когда представление передается докладчику почти таким же образом. См. Что появилось раньше: представление или модель? для обсуждения этой темы.

Или вы можете использовать третий объект, чтобы связать View и Presenter, например, IBinder service в Caliburn.

2 голосов
/ 09 ноября 2009

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

Как это:

class FooView : IFooView
{
    private readonly IFooPresenter presenter;

    public FooView(IFooPresenter presenter)
    {
        this.presenter = presenter;
    }
}

class FooPresenter1 : IFooPresenter
{
    private readonly IFooView view;

    public FooPresenter1()
    {
        view = new FooView(this);
    }
}
// or
class FooPresenter2 : IFooPresenter
{
    private readonly IFooView view;

    public FooPresenter2(IFooView view)
    {
        this.view = view;
        view.Presenter = this;
    }
}

И, кстати, вы, кажется, используете WPF. Если это так, вы можете вместо этого взглянуть на шаблон Model-View-ViewModel .

...