2010-08-24 4 views
9

У меня есть приложение WinForms со следующим кодом:Ninject возвращает инъекционного свойство Null

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, но это пустой объект.

Мысли?

ответ

3

Убедитесь, что вы вызываете функцию 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 
} 
+4

Благодаря Кевин, он исправляет эту проблему, но я думаю, что я после лучшего решения. Я продолжаю читать о «плохом запахе» большого количества инъекций и получать звонки, так как это не так. Я пытаюсь применить инъекции свойств, поскольку инъекция конструктора просто мешает всякому, когда я создаю экземпляр объекта. Наличие экземпляра ядра также кажется обратным? – mattdwen

+1

Я согласен - не передается ли экземпляр ядра почти так же плохо, как передать кучу зависимостей? –

+0

Я не уверен, как еще можно сделать DI в ASP.NET ... есть только так много мест, которые вы можете подключить к конвейеру и ввести свои зависимости. –

3

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

var form = new MainForm() 

...

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

....

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

var form = Kernel.Get<MainForm>() 

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

Я не знаю ни одного WinForms (или WPF) образцов для Ninject (но это был бы хороший вопрос, чтобы спросить и/или приклеивать Баунти на - IIRC один пришел недавно)

Смотрите также:

IoC/DI framworks with Smart Client Winform apps: How should I approach this?

What is the best practice for WinForms dialogs with ninject?