Holen Sie sich die container-Instanz für Einfache Injektor
Ich bin mit Einfach Injektor mit einer ASP.NET MVC-Projekt. Ich fügte hinzu, die SimpleInjector.Integration.Web.Mvc
nuget-Paket. Dies fügt SimpleInjectorInitializer
Klasse App_Start
Ordner und initialisiert die DI. Der code sieht etwa wie
public static void Initialize()
{
//Did you know the container can diagnose your configuration?
//Go to: https://simpleinjector.org/diagnostics
var container = new Container();
//Container configuration code
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
}
Dieser konfiguriert die DI für die MVC-controller korrekt.
Meine Frage ist, wenn ich will, um die Instanz der container in einem der controller - \Klasse zu lösen einige Abhängigkeiten manuell, wie kann ich es tun.
Habe ich früher gearbeitet AutoFac und es hat eine Abhängigkeit Schnittstelle IComponentContext
die injiziert werden kann, in jeder Klasse muss jede Auflösung manuell.
Update:
Hier ist ein Szenario. Mein controller verwendet einen service, der Initialisierung hängt von der input-parameter in der controller-Methode und damit die Abhängigkeit kann nicht instanziiert werden während der Bauzeit.
Ich verstehe, dass dies ist eher ein anti-pattern für DI, aber es ist Anforderung an wenigen stellen und damit die Injektion der DI-container ist die nächste beste Sache. Einfache Injektor-Proben sollte der Einsatz von statischen Variablen Anteil der container, die ich vermeiden will und auch ist es nicht möglich, durch die Art und Weise SimpleInjectorInitializer
funktioniert.
InformationsquelleAutor der Frage Chandermani | 2013-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Außer für den code, ist Teil des startup-Pfad von der Anwendung, keine code sollte hängen direkt auf den Behälter (oder container Abstraktion, container, Fassade, etc). Dieses Muster heißt Service Locator und Mark Seemann hat eine gute Erklärungwarum dies eine schlechte Idee ist.
Also-Komponenten (z.B. Regler) sollte nicht davon abhängen, ob die container direkt, da diese blendet die verwendeten Abhängigkeiten und macht Klassen schwerer zu testen. Darüber hinaus kann Ihr code beginnt zu hängen, ein äußerer Rahmen (das macht es schwieriger zu ändern) oder in Abhängigkeit von einer Abstraktion, die Sie nicht brauchen, um zu wissen.
Gibt es ein Allgemeines Muster für dieses problem: die abstract factory design pattern. Das Fabrik-Muster ermöglicht die Verzögerung von der Schöpfung der Arten und ermöglicht es Ihnen zu pass in extra-Laufzeit Parameter für die Konstruktion eines bestimmten Typs. Wenn Sie dies tun, wird Ihr controller nicht davon abhängen, Container und es wird verhindert, dass zu passieren, in einer konstruierten container in Ihre unit-tests (DI-frameworks sollten im Allgemeinen nicht verwendet werden, die in Ihrer unit-test-Projekte).
Tun, beachten Sie jedoch, dass die Vermietung Ihrer Komponenten erfordern,runtime-Daten während der Erstellung ist ein code smell. Verhindern tun.
Könnte man denken, dass durch diese Weise wir sind nur ein verschieben des Problems auf die factory-Implementierung. Zwar bewegen wir uns in die Abhängigkeit von der container-in die factory-Implementierung, wir sind in der Tat die Lösung des Problems, weil die factory-Implementierung wird ein Teil der Anwendung Zusammensetzung Rootdie es ermöglicht den code der Anwendung selbst blind für jede DI-framework.
So ist dies, wie ich beraten Sie, um Ihren code strukturieren:
In Ihrer Zusammensetzung root (den start-up-Pfad) definieren wir die factory-Implementierung und die Registrierung für Sie:
Bei der Erstellung, der
Container
registriert sich selbst (mit der callRegisterSingle<Container>(this)
), so kann man immer Spritzen den Behälter in einer Komponente. Das ist ähnlich wie die Injektion derIComponentContext
bei der Arbeit mit Autofac. Aber das gleiche gilt für Autofac, Einfache Injektor-und alle anderen Behälter: Sie will nicht Spritzen Sie Ihre container in Komponenten, die sich außerhalb der Zusammensetzung root (und es gibt kaum einen Grund für).InformationsquelleAutor der Antwort Steven