使用Ninject启动MVP WinForms应用程序



我正在尝试启动一个简单的模型视图演示程序WinForms应用程序,并使用构造函数注入将IMainViewIEventPublisherIRepository注入到主演示程序。

然而,我遇到了一些问题,想知道如何做到这一点。我的问题是,由于某种原因,演示者似乎创建了两个视图实例,或者视图已创建但未显示。

程序.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上初始化的,那么演示者也会创建自己的视图吗?使用上面的主动方法,会创建视图,但不会显示。

演示者.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容器。

如果视图在program.cs上初始化,那么prestor也会创建它自己的观点?

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

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

当请求视图的实例时,请确保您通过绑定(即var view = kernel.Get<View.IMainForm>();(这样做,否则Ninject将尝试自绑定,并避开您的singleton作用域。

相关内容

最新更新