2010-08-24 9 views
9

Tengo una aplicación Windows Forms con el siguiente código:rendimientos de inyección propiedad ninject nula

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

Para el Module.Load() evento:

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

En este punto test en el Main() método es el objeto adecuado que estoy esperando.

En una forma más adelante, estoy usando la inyección de la propiedad:

[Inject] 
TestInterface test {get;set;} 

Y una vez que se carga el formulario, tratando de trabajar con test, pero es un objeto nulo.

¿Pensamientos?

Respuesta

3

Asegúrese de llamar a Inject() en la instancia de IKernel y pasar una instancia de su formulario. Esto asegurará que todas las dependencias sean adecuadamente inyectadas. Por ejemplo ...

[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

Gracias Kevin, se soluciona el problema, pero creo que estoy después una solución mejor. Sigo leyendo sobre el "mal olor" de muchas inyecciones y llamadas, ya que no es cierto DI. Intento inyectar propiedades, ya que la inyección de constructores parece interferir cada vez que crea una instancia de un objeto. Tener una instancia del kernel también parece estar al revés? – mattdwen

+1

Estoy de acuerdo: ¿no está pasando una instancia del kernel casi tan mal como pasar un montón de dependencias? –

+0

No estoy seguro de qué otra cosa se podría lograr DI en ASP.NET ... solo hay tantos lugares que puede conectar a la canalización e inyectar sus dependencias. –

3

En vez de hacer

var form = new MainForm() 

...

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

....

¿Quieres estar haciendo:

var form = Kernel.Get<MainForm>() 

Lo que obvia la necesidad de la Inyección explícita (y le permite hacer la inyección del constructor).

No sé de ningún WinForms (o WPF) para muestras de Ninject (pero sería una buena pregunta para preguntar y/o pegar una recompensa por - IIRC acercó uno recientemente)

Ver también:

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

What is the best practice for WinForms dialogs with ninject?

Cuestiones relacionadas