Verwendung des Typs, der aufgelöst wird, um eine Abhängigkeit aufzulösen

8

Ich habe mehrere Klassen, die eine Abhängigkeit vom Typ ILogger haben. Die Implementierung von ILogger muss den Typ kennen, für den sie der Logger ist, d. H.% Co_de% für ILogger wird Foo , für new Logger(typeof(Foo)) wird Bar , etc.

Ich möchte, dass der richtige Logger automatisch von Unity injiziert wird; Mit anderen Worten, wenn ich new Logger(typeof(Bar)) aufruft, möchte ich, dass container.Resolve<Foo>() in die Instanz new Logger(typeof(Foo)) injiziert wird.

Wie kann ich das in Unity einrichten? Gibt es eine Möglichkeit, den aufgelösten Typ an die Abhängigkeit zu übergeben?

(In meinem echten Code habe ich tatsächlich eine Foo mit einer ILoggerFactory -Methode, die auch einen Typ als Parameter verwendet. Also könnte ich die Factory einfach an meine Klassen übergeben und sie würden Create aufrufen selbst um den richtigen Logger zu bekommen, aber es ist nicht so elegant wie das, was ich erreichen möchte)

Ein Code, um die Dinge klarer zu machen:

%Vor%

Diese verwandte Frage wird genau angezeigt Was ich versuche zu tun, und die akzeptierte Antwort ist genau die Art von Dingen, die ich suche ... aber es ist für NInject, nicht für Unity.

    
Thomas Levesque 09.02.2016, 16:37
quelle

2 Antworten

4

Hier ist eine Container-Erweiterung, die den Type-Parameter des Logger-Konstruktors auf den Typ setzt, in den der ILogger injiziert wird.

Die temporäre IBuilderContext.Policies wird verwendet, um den Typ zu speichern, in den der ILogger injiziert wird.

Vielleicht ist es komplizierter als es sein muss, aber das scheint zu funktionieren

%Vor%

Wie es funktioniert: Wenn ein Typ, der kein Logger ist, versucht wird, aufgelöst zu werden, wird der Typ während der TypeMapping-Phase (vor jeder Erstellung) auf einen Stapel geschoben. Später, vor der Erstellung, wenn der Typ ein Logger ist, wird der Typ, in den er injiziert wird, vom Stapel geleuchtet und dieser Typ wird als Resolver-Override verwendet. Wenn der Typ nach der Erstellung kein Logger ist, wird er vom Stapel entnommen.

Und etwas Code, um sicherzustellen, dass es funktioniert (Ich habe dem Logger eine Type-Eigenschaft hinzugefügt, nur um zu verifizieren, dass er richtig eingestellt ist):

%Vor%     
Randy Levy 11.02.2016, 05:58
quelle
0

Wie @spotco vorgeschlagen hat, würde ich auch Generika empfehlen. Die Einheitsregistrierung würde mit "offenen Generika" erfolgen, wie hier gezeigt. Diese einzige Registrierung gibt Ihnen die Möglichkeit, jeden Typ im Generics-Parameter von Logger aufzulösen.

%Vor%

Mit dieser Registrierung können Sie die Instanz mithilfe einer solchen Konstruktorinjektion auflösen.

%Vor%

Weitere Informationen hier .

    
TylerOhlsen 10.02.2016 02:53
quelle