2012-01-18 21 views
30

dire che ho tali classi gerarchia:Ninject iniezione di dipendenza con Decorator modello

public interface IRepository { } 

public class SomeSimpleRepository : IRepository {} 

Ora voglio "decorare" SomeSimpleRepository con funzioni aggiuntive

public class MoreAdvancedRespository : IRepository 
{ 
    private readonly IRepository _originalRepository; 

    public MoreAdvancedRespository(IRepository original) 
    { } 
} 

Dopo un po 'un altro ..

public class TrickyRepository : IRepository 
{ 
    private readonly IRepository _originalRepository; 

    public TrickyRepository (IRepository original) 
    { } 
} 

Ora, ho bisogno di eseguire il binding. Nell'applicazione ho bisogno dell'istanza di TrickyRepository, da inizializzare con MoreAdvancedRespository. Così, ho bisogno di scrivere qualcosa di simile:

Bind<IRepository>().To<TrickyRepository>.With ?? 

Qui sono confuso, ho bisogno in qualche modo di dire, prendere MoreAdvancedRespository ma inizializzare con SomeSimpleRepository. Questo è un tipo di catena di dipendenze che devono essere risolti su un'interfaccia.

Qualcuno ha suggerimenti su questo?

+1

possibile duplicato di [Come il binding viene eseguito con decoratori che utilizzano Ninject?] (Http://stackoverflow.com/questions/8447037/how-the-binding-are-done-with-decorators-using-ninject) –

+2

Possibile duplicato di [Come si fa il binding con decoratori usando Ninject?] (Https://stackoverflow.com/questions/8447037/how-the-binding-are-done-with-decorators-using-ninject) – NightOwl888

risposta

40

Uso WhenInjectedInto:

Bind<IRepository>().To<MoreAdvancedRespository> 
        .WhenInjectedInto<TrickyRepository>(); 
Bind<IRepository>().To<SomeSimpleRepository> 
        .WhenInjectedInto<MoreAdvancedRespository>(); 

Vedere this blog post per maggiori informazioni.

+0

questo è esattamente ciò che di cui ho bisogno –