Запустите приложение MVP WinForms с помощью Ninject
Я пытаюсь запустить приложение Simple Model View Presenter WinForms и использовать инъекцию конструктора для инъекции IMainView
, IEventPublisher
и IRepository
главному докладчику.
Программа.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 ответ:
Если представление инициализировано в программе.cs, то и presenter создает его собственный взгляд?
Это связано с областью видимости объекта. Если вы запросите IMainForm в программе.cs, а затем запросить Presenter, то Ninject введет новый экземпляр представления.MainForm для докладчика, и таким образом у вас есть два экземпляра представления. Чтобы использовать один и тот же экземпляр, необходимо задать область привязки в одноэлементной области.
Bind<IMainForm>().To<View.MainForm>().InSingletonScope();
При запросе экземпляра представления, убедитесь, что вы делаете это через привязку, т. е.
var view = kernel.Get<View.IMainForm>();
в противном случае Ninject попытается самосвязаться и будет уклоняться от вашей одноэлементной области.