2010-08-24 6 views
9

J'ai une application WinForms avec le code suivant:ninject retours d'injection de propriété Null

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

Pour l'événement Module.Load():

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

À ce stade test dans le Main() méthode est l'objet que j'attends.

Dans une forme plus tard, je suis en utilisant une injection de propriété:

[Inject] 
TestInterface test {get;set;} 

Et une fois que le formulaire est chargé, en essayant de travailler avec test, mais il est un objet nul.

Pensées?

Répondre

3

Assurez-vous que vous appelez Inject() sur l'instance IKernel et transmettez une instance de votre formulaire. Cela garantira que toutes les dépendances sont correctement injectées. Par exemple ...

[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

Merci Kevin, il résout le problème, mais je pense que je suis après une meilleure solution. Je continue de lire sur la "mauvaise odeur" de beaucoup d'injecter et d'obtenir des appels, car ce n'est pas vrai DI. J'essaie l'injection de propriété, car l'injection du constructeur semble juste gêner chaque fois que j'instancie un objet. Avoir une instance du noyau semble aussi à l'envers? – mattdwen

+1

Je suis d'accord - ne pas passer une instance du noyau presque aussi mauvais que de passer un tas de dépendances autour? –

+0

Je ne sais pas comment DI pourrait être réalisé dans ASP.NET ... il y a tellement d'endroits où vous pouvez vous connecter au pipeline et injecter vos dépendances. –

3

Au lieu de faire

var form = new MainForm() 

...

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

....

Vous voulez faire:

var form = Kernel.Get<MainForm>() 

Ce qui évite le besoin de l'Inject explicite (et vous permet de faire l'injection du constructeur).

Je ne sais pas de tout WinForms (ou WPF) échantillons pour Ninject (mais ce serait une bonne question à poser et/ou coller une prime sur - IIRC un homme se approcha récemment)

Voir aussi:

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

What is the best practice for WinForms dialogs with ninject?