2009-05-12 8 views
2

Je suis nouveau dans les frameworks IoC/DI. Le premier que j'essaie est le framework Ninject. Cela semble simple, mais je n'arrive pas à faire fonctionner mon application console. Je continue à obtenir une ActivationException indiquant:Pourquoi mon application Ninject DI échoue-t-elle avec une exception ActivationException?

"Error activating MainWindow: the StandardProvider returned an instance of type FutureRealisticDateManager, which is not compatible with the requested service. 
Using default binding from MainWindow to FutureRealisticDateManager (via StandardProvider) 
    declared by DateBindingModule.Load() 
Activation path: 
    1) active request for MainWindow 
    from Program.Main() 
    using default binding from MainWindow to FutureRealisticDateManager (via StandardProvider) 
    declared by DateBindingModule.Load()" 

Mon code est très simple. Voici mon fichier programme ...

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


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

Voici mon module de liaison ninject ...

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

Voici la classe qui reçoit la classe injectée ...

class MainWindow 
{ 
    private IRealisticDateManager _d; 

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

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

} 

Et voici la classe réelle étant injectée ...

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

Et enfin l'interface simple que la classe injectée doit mettre en œuvre ...

public interface IRealisticDateManager 
{ 
    DateTime GetRealisticDate(); 
} 

Quelqu'un peut-il voir ce que je fais mal?

Répondre

2

Il échoue parce que votre liaison n'est pas droite:

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

FutureRealisticDataManager ne possèdes pas de MainWindow. Au lieu de cela, vous devriez écrire:

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

Cela dit Ninject pour revenir FutureRealisicDateManager chaque fois IRealisicDateManager est demandé.

De cette façon, lorsque vous appelez le k.Get<MainWindow>(), le noyau va injecter FutureRealisticDateManager au constructeur.

+0

Ah, c'est tout à fait logique. Merci Mokosh! – willem