【问题标题】:Start a MVP WinForms application with Ninject使用 Ninject 启动 MVP WinForms 应用程序
【发布时间】:2018-07-13 07:32:25
【问题描述】:

我正在尝试启动一个简单的 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 容器。

【问题讨论】:

    标签: c# winforms ninject mvp


    【解决方案1】:

    如果视图在 program.cs 上初始化,那么演示者也会创建 有自己的看法?

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

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

    当请求视图的实例时,请确保您通过绑定来执行此操作,即 var view = kernel.Get&lt;View.IMainForm&gt;(); 否则 Ninject 将尝试自行绑定并避开您的单例范围。

    【讨论】:

    • 即使在这个范围内,并通过var view = kernel.Get&lt;View.MainForm&gt;(); 启动应用程序,然后将此视图提供给Application.Run(view),也会创建两个视图实例。如果没有 view 参数,则不会显示任何窗口。
    • @ajr 您应该通过绑定请求视图,即 var view = kernel.Get();否则 Ninject 会尝试自我绑定,并会避开你的单例范围。
    • 这行得通,谢谢!作为一个额外的问题,通过将此 view 传递给 Run() 来启动 winforms 应用程序是否有一些缺点?如果您可以将以前的评论信息添加到答案中,我将接受它作为答案。
    • @ajr 更新了答案。从内核请求视图并传递给 Application.Run() 没有任何缺点。只有这样才能注入它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多