Внедрение зависимости MVP

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

12
задан leora 9 October 2008 в 20:41
поделиться

2 ответа

Вот то, что я делаю:

Во-первых, я определяю интерфейсы тезисов:

public interface IView<TPresenter>
{
    TPresenter Presenter { get; set; }
}

public interface IPresenter<TView, TPresenter>
    where TView : IView<TPresenter>
    where TPresenter : IPresenter<TView, TPresenter>
{
    TView View { get; set; }
}

Затем этот абстрактный класс предъявителя:

public abstract class AbstractPresenter<TView, TPresenter> : IPresenter<TView, TPresenter>
    where TView : IView<TPresenter>
    where TPresenter : class, IPresenter<TView, TPresenter>
{
    protected TView view;

    public TView View
    {
        get { return this.view; }
        set
        {
            this.view = value;
            this.view.Presenter = this as TPresenter;
        }
    }
}

Представление введено через свойство, вместо конструктора, для разрешения двунаправленной привязанности в методе set. Заметьте, что необходим безопасный бросок...

Затем мой конкретный предъявитель - что-то как:

public class MyPresenter : AbstractPresenter<IMyView, MyPresenter>
{
    //...
}

Где IMyView реализации IView. Конкретный тип представления должен существовать (например. MyView), но это - контейнер, который разрешает его:

  1. Я регистрируюсь MyPresenter введите как самостоятельно в контейнере с переходным поведением.
  2. Я регистрируюсь MyView как IMyView в контейнере с переходным поведением.
  3. Я затем прошу a MyPresenter к контейнеру.
  4. Контейнер instanciate MyView
  5. Это instanciates a MyPresenter
  6. Это вводит представление в предъявителя через AbstractPresenter.View свойство.
  7. Код метода set завершает двунаправленную ассоциацию
  8. Контейнер возвращает Предъявителя/Представление пары

Это позволяет Вам вводить другие зависимости (сервисы, repos) и в Ваше представление и в Вашего предъявителя. Но в сценарии Вы описали, я рекомендую Вам ввести сервисы и кэши в предъявителя вместо представления.

13
ответ дан 2 December 2019 в 07:22
поделиться

В WinForms я предпочитаю простой подход. Обычно вы имеете дело с несколькими UserControls на поверхности дизайна - сделайте их своими классами представления. .NET создает для вас иерархию элементов управления (через InitializeComponent). Если вы используете шаблон Passive View , каждое представление затем создает экземпляр своего презентатора. (Вы можете сделать это напрямую или запросив контейнер IOC.) Используйте внедрение конструктора, чтобы передать ссылку на интерфейс представления в конструктор докладчика. Затем ведущий может подключиться к просмотру событий. Повторите процесс для модели: докладчик создает экземпляр модели и подключается к ее событиям. (В этом случае вам не нужна инъекция конструктора, поскольку в пассивном представлении говорится, что ведущий хранит ссылку на модель, а не наоборот.)

Единственное, что я ' При таком подходе мы обнаружили, что правильно управляют сроками жизни модели и ведущего. Вы хотите, чтобы представление было как можно более простым, поэтому вы, вероятно, не хотите, чтобы оно сохраняло ссылку на докладчика. Однако это означает, что у вас есть этот объект-презентатор, завязанный с обработчиками событий, привязанными к вашему представлению. Эта настройка предотвращает сборку мусора для вашего представления. Одно из решений - сделать так, чтобы ваше представление публиковало событие, указывающее на его закрытие. Ведущий получит событие и удалит подписки на модель и представление. Теперь объекты в вашей сети правильно разыменованы, и сборщик мусора может приступить к своей работе.

В итоге вы получаете что-то вроде следующего:

8
ответ дан 2 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: