2016-05-09 17 views
0

ich einige Beispiele tue Injection verstehen ninject mit ...Setter Injection funktioniert nicht

aber endete mit Verwirrung in Injektion up ..

Ex: -

folgendes Beispiel: -

class Busineesss 
{ 
    FirstInterface targetInter = null; 

    [Inject] //Setter Injection 
    public SecondInterface ProInj { get; set; } 

    [Inject] //Ctor Injection 
    public Busineesss(FirstInterface inbound) 
    { 
     targetInter = inbound; 
    } 

    public void run() 
    { 
    /*Line:X*/   targetInter.doSomeThing(); 
    /*Line:Y*/  ProInj.GetSomethingMyName(); 
    } 
} 


interface FirstInterface 
{ 
    void doSomeThing(); 
} 

interface SecondInterface 
{ 
    void GetSomethingMyName(); 
} 

Module und Haupt:

public class Module : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<FirstInterface>().To<FirstImplementer>(); 
     Bind<SecondInterface>().To<SecondImplementer>(); 
    } 
} 

static void Main(string[] args) 
    { 
     StandardKernel std = new StandardKernel(); 
     std.Load(Assembly.GetExecutingAssembly()); 

     FirstInterface obj = std.Get<FirstInterface>(); 

     Busineesss b = new Busineesss(obj); //Injecting Ctor data here 
     b.run(); 
    } 

Mein Verständnis: - So, wie pro meinem Verständnis, haben wir manuell die Stammklasse mit notwendigen Daten nennen, dann ist die Ninject der verbleibenden Abhängigkeiten von selbst lösen.

  1. So, dachte ich, dass in der Line: Y, wird die Instanz von SecondImplementer bekommen, da es in dem Modul definiert ist.

Aber ich habe keine dieser Sachen bekommen. Ich bekomme Null Ausnahme nur an der Linie ProInj.GetSomethingMyName().

  1. Wenn Ninjector ist Pflege der Injektion unter, dann, warum ich die Daten in dem Ctor der Wurzelklasse passieren sollte, in der Linie „Busineesss b = new Busineesss (obj) ", sollte es von sich aus richtig gemacht werden .. So sollte es so sein, müssen wir nur den Namen der Startup-Klasse erwähnen ... Diese Frage ergab sich aus der im Abschnitt "Mein Verständnis" genannten Zeile. ...

Könnte u Freunde helfen mir, diese in das Verständnis, so kann ich ein wenig mehr verstehen ....

Vielen Dank im Voraus ..

+2

Wenn Sie das Objekt selbst "neu" erstellen, kann der Container keine Abhängigkeiten in das Objekt einfügen. Versuchen Sie 'Busineess' aus dem Container zu lösen. – qujck

+2

Und warum verwenden Sie überhaupt Immobilieninjektion? Alle Abhängigkeiten sollten über den Konstruktor eingefügt werden, da Abhängigkeiten nicht optional sein sollten und das Property Injection [temporale Kopplung] verursacht (http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/). – Steven

+0

@Steven: Hi, ich lerne gerade die Dinge. Aber ich werde Ihre Eingabe während der Implementierung haben. Vielen Dank. – NANDAKUMAR

Antwort

2

Das Problem ist, Sie sind new uping den Busineesss Service, wenn Sie es aus dem Container lösen sollten. Ersetzen:

FirstInterface obj = std.Get<FirstInterface>(); 
Busineesss b = new Busineesss(obj); 

mit:

Busineesss b = std.Get<Busineesss>(); 

sollte Ihr Problem lösen.