Запустите приложение MVP WinForms с помощью Ninject


Я пытаюсь запустить приложение Simple Model View Presenter WinForms и использовать инъекцию конструктора для инъекции IMainView, IEventPublisher и IRepository главному докладчику.

Однако у меня возникли некоторые проблемы, чтобы выяснить, как именно это сделать. Моя проблема заключается в том, что по какой-то причине presenter, кажется, создает два экземпляра представления или представление создается и не отображается.

Программа.cs

  var kernel = new StandardKernel();
  kernel.Load(Assembly.GetExecutingAssembly());
  //var view = kernel.Get<View.MainForm>();
  var presenter = kernel.Get<Presenter>();

  //Application.Run(view);
  Application.Run();

Если представление инициализировано в программе.КС, тогда еще и ведущий создает свой собственный взгляд? А при активном подходе выше вид создается, но не показывается.

Ведущий.cs

public Presenter(IMainForm view,
  IRepository repository,
  IEventPublisher eventPublisher)
{
  _view = view;
  _repository = repository;
  _reactiveEventPublisher = eventPublisher;
}

Главная форма.cs

public Form(IEventPublisher eventPublisher)
{
  _reactiveEventPublisher = eventPublisher;
}

NinjectBindings.cs

  public class NinjectBindings : NinjectModule
  {
    public override void Load()
    {
      Bind<IRepository>().To<Repository>();

      Bind<IMainForm>().To<View.MainForm>();

      Bind<IEventPublisher>().To<ReactiveEventAggregator>().InSingletonScope();

      Bind<Presenter>().ToSelf();

    }
  }

Вопрос в том, как правильно запустить приложение WinForms в случае, если представление вводится в презентер?

Использование Ninject 3.3.4 в качестве контейнера IoC.

1 2

1 ответ:

Если представление инициализировано в программе.cs, то и presenter создает его собственный взгляд?

Это связано с областью видимости объекта. Если вы запросите IMainForm в программе.cs, а затем запросить Presenter, то Ninject введет новый экземпляр представления.MainForm для докладчика, и таким образом у вас есть два экземпляра представления. Чтобы использовать один и тот же экземпляр, необходимо задать область привязки в одноэлементной области.

Bind<IMainForm>().To<View.MainForm>().InSingletonScope();

При запросе экземпляра представления, убедитесь, что вы делаете это через привязку, т. е. var view = kernel.Get<View.IMainForm>(); в противном случае Ninject попытается самосвязаться и будет уклоняться от вашей одноэлементной области.