Инъекция свойства Ninject возвращает ноль - PullRequest
9 голосов
/ 24 августа 2010

У меня есть приложение WinForms со следующим кодом:

static void Main()
{
    IKernel kernel = new StandardKernel(new MyModule());
    TestInterface test = kernel.Get<TestInterface>();
}

Для события Module.Load ():

Bind<TestClass>().ToSelf().InSingletonScope();
Bind<TestInterface>().To<TestClass>();

На данный момент test в методе Main() является правильным объектом, которого я ожидаю.

В форме позже я использую инъекцию свойства:

[Inject]
TestInterface test {get;set;}

И как только форма загружена, пытаемся работать с test, но это нулевой объект.

Мысли

Ответы [ 2 ]

3 голосов
/ 24 августа 2010

Вместо того, чтобы делать

var form = new MainForm()

...

class MainForm
{
    MainForm()
    {
        GlobalKernel.Inject(this)

....

Вы хотите сделать:

var form = Kernel.Get<MainForm>()

Что устраняет необходимость явного Inject (и позволяет вам делать инъекцию в конструктор).

Я не знаю ни одного примера WinForms (или WPF) для Ninject (но было бы неплохо задать вопроси / или добавьте вознаграждение - IIRC недавно появилось)

См. также:

IoC / DI framworks с приложениями Smart Client Winform: Как мне подходить к этому?

Какова наилучшая практика для диалогов WinForms с ninject?

3 голосов
/ 24 августа 2010

Убедитесь, что вы вызываете Inject () для экземпляра IKernel и передаете экземпляр вашей формы.Это обеспечит правильное внедрение всех зависимостей.Например ...

[Inject]
TestInterface Test { get; set; }

private void Form_Load(object sender, EventArgs e)
{            
    IKernel kernel = ... // Get an instance of IKernel
    kernel.Inject(this);

    // Your form dependencies have now been injected and the 
    // Test property is ready to use
}
...