2009-05-12 6 views
2

Ich bin neu in IoC/DI-Frameworks. Der erste, den ich versuche, ist der Ninject-Rahmen. Es scheint einfach, aber ich kann meine Konsolenanwendung nicht ausführen. Ich bekomme immer eine ActivationException mit:Warum schlägt meine Ninject DI-Anwendung mit einer ActivationException fehl?

Mein Code ist sehr einfach. Hier ist meine Programmdatei ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     IKernel k = new StandardKernel(new DateBindingModule()); 


     MainWindow mw = k.Get<MainWindow>(); 
     mw.Show(); 
     Console.ReadLine(); 
    } 
} 

Hier ist mein ninject Bindungsmodul ...

public class DateBindingModule : StandardModule 
{ 
    public override void Load() 
    { 
     Bind<MainWindow>().To<FutureRealisticDateManager>(); 
    } 
} 

Hier ist die Klasse, die die injizierten Klasse erhält ...

class MainWindow 
{ 
    private IRealisticDateManager _d; 

    [Inject] 
    public MainWindow(IRealisticDateManager dateManager) 
    { 
     _d = dateManager; 
    } 

    public void Show() 
    { 
     Console.WriteLine("*** MainWindow [" + _d.GetRealisticDate().ToString() + "] "); 
    } 

} 

Und hier ist die tatsächliche Klasse, die eingespritzt wird ...

public class FutureRealisticDateManager : TestNinject.IRealisticDateManager 
{ 
    public DateTime GetRealisticDate() 
    { 
     return DateTime.Now.AddDays(15); 
    } 
} 

Und schließlich die einfache Schnittstelle, die die injizierte Klasse implementieren sollte ...

public interface IRealisticDateManager 
{ 
    DateTime GetRealisticDate(); 
} 

Kann jemand sehen, was ich falsch mache?

Antwort

2

Es schlägt fehl, da Ihre Bindung ist nicht richtig:

Bind<MainWindow>().To<FutureRealisticDateManager>(); 

FutureRealisticDataManager erbt nicht von MainWindow. Stattdessen sollten Sie schreiben:

Bind<IRealisticDateManager>().To<FutureRealisticDateManager>(); 

Dies sagt Ninject FutureRealisicDateManager zurückzukehren, wenn IRealisicDateManager angefordert wird.

Auf diese Weise, wenn Sie k.Get<MainWindow>() Kernel aufrufen wird FutureRealisticDateManager in den Konstruktor injizieren.

+0

Ah, das macht Sinn. Danke Mokosh! – willem

Verwandte Themen