使用 Ninject 启动 MVP WinForms 应用程序

Start a MVP WinForms application with Ninject

我正在尝试启动一个简单的 Model View Presenter WinForms 应用程序并使用构造函数注入将 IMainViewIEventPublisherIRepository 注入主演示器。

但是,我在了解如何准确执行此操作时遇到了一些问题。我的问题是,出于某种原因,演示者似乎创建了视图的两个实例,或者视图已创建但未显示。

Program.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();

如果视图是在 program.cs 上初始化的,那么演示者是否也创建了自己的视图?使用上面的主动方法,创建了视图但未显示。

Presenter.cs

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

MainForm.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 容器。

If view is initialized on the program.cs, then also presenter creates its own view?

这是因为 object scoping。如果您在 Program.cs 中请求一个 IMainForm,然后请求一个 Presenter,那么 Ninject 将为 Presenter 注入一个新的 View.MainForm 实例,因此您有两个视图实例。要使用相同的实例,您需要在单例范围内限定绑定范围。

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

请求视图实例时,请确保通过绑定进行,即 var view = kernel.Get<View.IMainForm>(); 否则 Ninject 将尝试自绑定并避开您的单例范围。