Wenn ich eine Klasse habe, die zwei Abhängigkeiten vom selben Typ hat (benötigt zwei verschiedene Instanzen), ist der einzige Unterschied zwischen den Instanzen eine tiefere Abhängigkeit, was ist der beste Weg, um Ninject DI auszuführen und die zwei Graphen zu behalten trennen?
Beispielobjektdiagramm:
%Vor% Konstruktor der Klasse C
:
Wie stelle ich also sicher, dass das mit ClassB
instanziierte foo
als ClassB
dependancy foo
und bar
... bar
?
Nur für einen Hintergrund, ich hatte einige Anforderungen ändern, also muss ich ein schreibgeschütztes Repository (IAdd) durch eine zusammengesetzte schreibgeschützte Repository
ersetzen %Vor%Mit Spott, das war einfach genug, konnte ich nur mit Namen injizieren:
%Vor% Das Problem kommt, wenn ich die echten Repositories verwende; foo
und bar
schreiben letztendlich in Dateien, so dass sie unterschiedliche Dateinamen benötigen. Da sie StreamWriter
repositories sind, erhält eine ihrer Abhängigkeiten die zwei verschiedenen Dateinamen.
Der einzige Weg, den ich bis jetzt gefunden habe, ist, eine benannte FileName
, genannt FileStreamWriterFactory
, mit dem Namen StreamRepository
× 2 (einmal für foo
und einmal für bar
) zu erstellen. Das scheint sehr viel Arbeit zu sein, also hoffe ich, dass es eine bessere Lösung gibt.
Ich kann bei Bedarf eine neue Architektur erstellen, es war eine elegante Art, die Einträge schnell zu ergänzen, wenn sich die Anforderungen änderten. Ich bin mir bewusst, dass meine Klassen alle sehr spezifisch sind, aber ich denke, dass Single Responsibility dies allgemein unterstützen würde und in meinem Fall schreiben wir eine Menge kleiner Anwendungen und haben mehr Anfragen, die wir erfüllen können, also ist es ein guter Weg, viel wiederverwendbaren Code zu haben herumliegen, dass ich im Grunde nur für verschiedene Aufgaben neu konfigurieren muss.
Lösung
Remo Gloor sollte Kredit bekommen; Das ist wahrscheinlich die beste Praxis.
Was ich tatsächlich getan habe, war eine neue Erweiterung erstellen
%Vor%Damit kann ich leicht kontrollieren, welche Datei in welches Repository importiert wird.
%Vor%Es gibt wahrscheinlich eine bessere Lösung, also würde ich das nicht für andere empfehlen, aber es funktioniert gut für mich.
Ja, es gibt einen besseren Weg
Siehe Ссылка
Es ist 3.0, aber IsAnyAnchestorNamed kann auch mit 2.2 aus einer When-Bedingung verwendet werden.