Schloss Windsor Lazy Load Services

8

Gelegentlich befinde ich mich in einer Situation, in der ich einen Dienst nur auflösen muss, wenn eine bestimmte Bedingung erfüllt ist. Beispielsweise könnte ein Benutzer auswählen, eine E-Mail oder eine SMS-Benachrichtigung zu senden. Ich würde gerne den E-Mail- oder SMS-Dienst laden, je nachdem, was der Benutzer wählt, so dass ich nicht beide laden muss und Ressourcen verschwenden muss (was wäre, wenn es zum Beispiel 10 Optionen für den Benutzer gäbe ...? ).

Das Problem, das ich habe, besteht darin, den Container außerhalb meines Bootstrap-Codes zu verwenden (ich möchte meinen Code nicht von diesem Container abhängig machen). Ich kann anscheinend keinen Weg finden, den Container für Lazy-Loading-Dienste zu verwenden (es sei denn, ich erstelle die benötigten Dienste manuell und mache alle DI manuell). Ist dies eine Situation, in der die Regeln verbogen werden können oder gibt es einen besseren Weg, dies zu tun?

    
orourkedd 26.12.2012, 15:27
quelle

3 Antworten

5

Wenn Sie Castle Windsor 3.0 oder neuer verwenden, können Sie die faule Auflösung verwenden.

Weitere Informationen finden Sie Was gibt es Neues in Windsor 3 .

Der Registrierungsprozess ändert sich ein wenig (neuer Komponentenlader muss registriert werden).

Danach registrieren Sie nur Komponenten wie immer, lösen Abhängigkeiten jedoch als Lazy<T> statt als T . Bis Sie nicht auf die .Value -Eigenschaft von Lazy<T> zugreifen können, wird die Abhängigkeit nicht aufgelöst, so dass Sie einige träge ausgewertete Objekte passieren können und nur auf das Objekt zugreifen können, das Sie benötigen und wann Sie es brauchen.

Wenn Sie mehr Optionen für den Benutzer haben, sollten Sie vielleicht eine abstrakte Factory-Schnittstelle erstellen. Sie würden dann nur diese Fabrik registrieren und auflösen, und die Fabrik selbst würde einen geeigneten Dienst zum Senden von Benachrichtigungen erstellen (sei es eine Mail, eine SMS oder eine andere Option). Die Implementierung der Fabrik kann von Hand oder Schloss Windsor können Sie damit (ich denke von Version 3.0) codiert werden.

Wenn ich eine solche Fabrik verwende, implementiere ich sie oft von Hand und gebe Container als Abhängigkeit weiter, so dass nur die Fabrikimplementierung von meinem Container abhängt.

    
Marcin Deptuła 26.12.2012, 15:36
quelle
2

Nur ein Beispiel zu vereinfachen (basierend auf Marcin Deptuła Antwort)

%Vor%

löse langsam auf (Eigenschaft Injektion)

%Vor%

Auflösung normal (Eigenschaft Injektion)

%Vor%     
Soren 21.08.2013 05:04
quelle
1

Im Allgemeinen können Sie das mit der Typ-Factory-Funktion .

Kurz gesagt, wenn Sie die Komponente, die diese Dienste verwendet, auflösen, anstatt ihr einen E-Mail- oder SMS-Dienst zu geben, geben Sie ihr eine Fabrik , die sie erstellen kann (die von Ihnen definiert wird). ohne Bezug auf den Container)

Die Einrichtung kümmert sich darum, Ihre Fabrik zu "implementieren" (von der Schnittstelle, die Sie erstellen), also gibt es sehr wenig zu tun.

    
Diego Mijelshon 26.12.2012 15:37
quelle