отправить данные из родительского компонента, где я получаю их в конструкторе
Вот то, что я делаю:
Во-первых, я определяю интерфейсы тезисов:
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
), но это - контейнер, который разрешает его:
MyPresenter
введите как самостоятельно в контейнере с переходным поведением.MyView
как IMyView
в контейнере с переходным поведением.MyPresenter
к контейнеру.MyPresenter
AbstractPresenter.View
свойство.Это позволяет Вам вводить другие зависимости (сервисы, repos) и в Ваше представление и в Вашего предъявителя. Но в сценарии Вы описали, я рекомендую Вам ввести сервисы и кэши в предъявителя вместо представления.
В WinForms я предпочитаю простой подход. Обычно вы имеете дело с несколькими UserControls на поверхности дизайна - сделайте их своими классами представления. .NET создает для вас иерархию элементов управления (через InitializeComponent). Если вы используете шаблон Passive View , каждое представление затем создает экземпляр своего презентатора. (Вы можете сделать это напрямую или запросив контейнер IOC.) Используйте внедрение конструктора, чтобы передать ссылку на интерфейс представления в конструктор докладчика. Затем ведущий может подключиться к просмотру событий. Повторите процесс для модели: докладчик создает экземпляр модели и подключается к ее событиям. (В этом случае вам не нужна инъекция конструктора, поскольку в пассивном представлении говорится, что ведущий хранит ссылку на модель, а не наоборот.)
Единственное, что я ' При таком подходе мы обнаружили, что правильно управляют сроками жизни модели и ведущего. Вы хотите, чтобы представление было как можно более простым, поэтому вы, вероятно, не хотите, чтобы оно сохраняло ссылку на докладчика. Однако это означает, что у вас есть этот объект-презентатор, завязанный с обработчиками событий, привязанными к вашему представлению. Эта настройка предотвращает сборку мусора для вашего представления. Одно из решений - сделать так, чтобы ваше представление публиковало событие, указывающее на его закрытие. Ведущий получит событие и удалит подписки на модель и представление. Теперь объекты в вашей сети правильно разыменованы, и сборщик мусора может приступить к своей работе.
В итоге вы получаете что-то вроде следующего: