2012-12-17 6 views
15

Ich bin gerade dabei, Ninject aus meinem Projekt zu entfernen und zum Simple Injector zu wechseln, aber es gibt eine Sache, die ich nicht richtig funktionieren kann.Simple Injector: Einen Typ mit einem Konstruktorargument registrieren, das auf seinem Vater basiert

Für meine Protokollierung in der Registrierung von Diensten, ich war vorher der Lage, in einem Parameter in meine Logging-Klasse übergeben als solche

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

ich nach einem Weg suchen diese in einfache Injector neu zu erstellen. Bis jetzt habe ich alles andere als das funktioniert. Ich kann die Protokollierung, wenn auch zu arbeiten, ohne die richtigen Logger Namen hat, folgenden, indem Sie wie gezeigt wird:

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

Wer noch keine Erfahrung etwas Ähnliches bekam dabei

+1

Verwandte: http://stackoverflow.com/questions/13675137/how- An-Zurück-auf-Instanz-basiert-auf-seinem-Eltern-Verwendung-Einfach-Injektor – Steven

Antwort

11

Diese Registrierung ist eine Form von Kontext basierte Injektion. Sie können hierfür eine der Überladungen RegisterConditional verwenden.

RegisterConditional jedoch nicht die Verwendung von Factory-Methoden, um einen Typ zu konstruieren. So sollten Sie eine generische Version Ihrer Logger Klasse erstellen, wie folgt:

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

Sie können es wie folgt registrieren:

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

aber bitte lesen this Stackoverflow question (und meine Antwort) und fragen sich, wenn Sie protokollieren nicht zu viel.

5

Context based injection wird jetzt in Simple Injector 3 unter Verwendung der RegisterConditional Methode unterstützt. Zum Beispiel einen Logger in Consumer1 und einem Logger in Consumer2 zu injizieren, verwenden Sie die RegisterConditional Überlastung, die eine Implementierung Art Fabrik Delegierten akzeptiert wie folgt:

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