2011-12-09 7 views
9

Sulla base di questa domanda: Should thoses kind of service go injected in a base class ? (versus static classes).In che modo la rilegatura viene eseguita con decoratori che utilizzano Ninject?

Come si eseguirà la rilegatura con decoratori che utilizzano Ninject? o qualsiasi DIContainer?

public class CachedLoggedRepository : IRepository 
{ 
    public IRepository repository { get; set; } 
    void Add(); 
} 

public class CachedRepository : IRepository 
{ 
    public IRepository repository { get; set; } 
    void Add(); 
} 

public class Repository : IRepository 
{ 
    void Add(); 
} 

risposta

15

devi usare attacchi condizionali per esempio

Bind<IRepository>().To<Repository>().WhenInjectedInto<CachedRopsitory>(); 
Bind<IRepository>().To<CachedRepository>().WhenInjectedInto<CachedLoggedRepository>(); 
Bind<IRepository>().To<CachedLoggedRepository>(); 
+1

Grazie per questa meravigliosa risposta. – Rushino

+2

+1 E in alcuni casi (molto più rari), potresti usare un 'TImpl' generico, nel qual caso devi' Bind >(). A () 'come sopra - in questo caso tu usa una clausola '.When' leggermente diversa che [vincola] (https://github.com/ninject/ninject/wiki/ContestualBinding) basata sul tipo generico di base del tipo di calcestruzzo in cui viene iniettato. Un'altra cosa utile da tenere a mente è che se dovessi trovare qualcosa di leggermente diverso da ciò che è necessario, otterrai la fonte Ninject e troverai i file/analisi statica attraverso di essa per trovare esempi - ad es. guarda a 'WhenInjectedInto' –

+0

Come si può fare quando si configurano più dipendenze per convenzione? – Rookian

Problemi correlati