2012-12-17 13 views
15

Attualmente sono in corso la rimozione di Ninject dal mio progetto e il passaggio a Simple Injector ma c'è una cosa che non riesco a far funzionare correttamente.Iniettore semplice: registrazione di un tipo con argomento costruttore basato sul suo genitore

Per la mia registrazione, nella registrazione di servizi, sono stato in precedenza in grado di passare in un parametro nella mia classe di registrazione in quanto tale

_kernel.Bind<ILogger>().To<Logger>() 
    .WithConstructorArgument("name", 
     x => x.Request.ParentContext.Request.Service.FullName); 

Sto cercando un modo per ricreare questo in semplice iniettore. Finora ho tutto il resto a lavorare, ma questo. Posso ottenere la registrazione per lavorare, pur senza avere i nomi corretti logger viene mostrato, nel modo seguente:

_container.Register<ILogger>(() => new Logger("test")); 

Chiunque ha alcuna esperienza nel fare qualcosa di simile?

+1

Correlati: http://stackoverflow.com/questions/13675137/how- al ritorno-di-instance-based-on-suo-padre-con-semplici-iniettore – Steven

risposta

11

Questa registrazione è un modulo di iniezione basata sul contesto. È possibile utilizzare uno dei sovraccarichi RegisterConditional per questo.

RegisterConditional tuttavia non consente l'utilizzo di metodi di fabbrica per costruire un tipo. Così si dovrebbe creare una versione generica della classe Logger, come segue:

public class Logger<T> : Logger 
{ 
    public Logger() : base(typeof(T).FullName) { } 
} 

è possibile registrarlo come segue:

container.RegisterConditional(
    typeof(ILogger), 
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType), 
    Lifestyle.Transient, 
    c => true); 

Ma siete pregati di leggere this Stackoverflow question (e la mia risposta) e mettere in discussione se stessi, se non stai registrando troppo.

5

Context based injection è ora supportato in Simple Injector 3 utilizzando il metodo RegisterConditional. Ad esempio, per iniettare un Logger in Consumer1 e un Logger in Consumer2, utilizzare l'overload RegisterConditional che accetta un delegato di fabbrica tipo di implementazione come segue:

container.RegisterConditional(
    typeof(ILogger), 
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType), 
    Lifestyle.Transient, 
    c => true); 
Problemi correlati