DI mit der Einheit, wenn mehrere Instanzen der gleichen Art gebraucht wird
Ich brauche Hilfe mit diesem. Ich bin mit Unity als mein container und ich möchte zum einleiten von zwei unterschiedlichen Instanzen des gleichen Typs in meiner Konstruktor.
class Example
{
Example(IQueue receiveQueue, IQueue sendQueue) {}
}
....und IQueue ist, implementiert in meinen MessageQueue-Klasse....
class MessageQueue : IQueue
{
MessageQueue(string path) {}
}
Wie kann ich einleiten von zwei unterschiedlichen Instanzen der MessageQueue-in meinem Beispiel-Klasse? Jeder der MessageQueue-Instanzen erstellt werden, mit unterschiedlichen Pfad.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es viele Wege zur Erreichung der Ergebnisse, die Sie wollen (was sich durch die Mehrfachnennungen). Hier ist ein weiterer Weg, mit Namen-Registrierungen (ohne Attribute):
Der Nachteil dieses Ansatzes ist, dass, wenn die Beispiel-Konstruktor geändert wird, dann wird der Registrierungs-code muss auch angepasst werden. Auch, der Fehler wäre ein runtime error und nicht mehr bevorzugt compile-Zeit-Fehler.
Könnten Sie kombinieren die oben mit einem InjectionFactory zum aufrufen des Konstruktors manuell zu geben compile-Zeit-Prüfung:
Wenn Sie mit einer Komposition root, dann ist die Benutzung des magic-strings ("ReceiveQueue" und "SendQueue") wäre beschränkt auf die eine Registrierung Lage.
Ihnen konnten sich die zwei Instanzen mit den Namen:
und dann sollte man lösen können, indem Namen, aber es erfordert die Verwendung der
Dependency
Attribut:oder Spritzen Sie den unity-container und lösen dann die Instanzen innerhalb der Konstruktor:InjectionFactory
statt.Nicht alles sein WLAN automatisch durch den container. Sie können sich um die
Example
Klasse wie folgt aus:MessageQueue
-- keine separateReceiveQueue
undSendQueue
Klassen.Gut, nicht
Sollten Sie die factory-Muster in diesem Fall.
Macht es die Absicht, viel mehr klar und können Sie intern in der
Example
Klasse behandeln, wenn die Warteschlangen werden nicht gefunden oder falsch konfiguriert ist.Example
, da es hängt jetzt auf einer extra-Abstraktion. Ich würde entfernen Sie dieIQueueFactory
Abhängigkeit vonExample
und wenn die Verwendung der Fabrik benötigt wird, registrieren Sie es mit einemInjectionFactory
wie folgt:container.Register<Example>(new InjectionFactory(c => new Example(c.Resolve<IQueueFactory>().Create("Receive"), c.Resolve<IQueueFactory().Create("Send"))));
.Ich glaube, das war vor der Frage auf Stackoverflow.
Sie benötigen ParameterOverride:
ParameterOverride können Sie übergeben die Werte für Konstruktor-Parameter überschreiben, die einen übergebenen parameter zu einem gegebenen namens constructor. Nur der Wert des Parameters überschrieben wird, nicht der Konstruktor.
Link zum MSDN Artikel
Link zu Stackoverflow-Artikel
5 Jahre später, aber ich war auf der Suche nach dieser Antwort zu.
Ich arbeitete durch Sie mit meinem eigenen code, und dann beschlossen, zum erstellen von funktionierenden code mit (leicht verändert) Klassen der OP zur Verfügung gestellt.
Dies ist ein ganzes Beispiel arbeiten, die Sie kopieren können in LINQPad (programmer ' s playground) und ausführen.
Using-Anweisung /Einheit Libary
Müssen Sie fügen Sie einen Verweis zu Microsoft.Practices.Unity.dll
Müssen Sie auch fügen Sie eine using-Anweisung von :
In LinqPad drücken Sie F4, um den Verweis hinzuzufügen und die using-Anweisung (namespace importieren).
Ausgabe Für Prüfung
Wenn Sie das Skript ausführen oben sehen Sie Beispiel-Ausgabe, welche wie folgt Aussehen: