In der Vergangenheit habe ich Swiftsuspenders verwendet, das ist ein ActionScript 3 IoC Controller. Im Grunde hatte die erste Version von switchfsusder etwas Ähnliches wie der Ninject-Kernel, der Injector genannt wurde.
Wenn ich einen Anwendungsinjektor erstellen wollte (mit den wichtigsten Zuordnungen, die in der gesamten Anwendung verwendet werden), musste ich den Injektor selbst in die Anwendungsklassen injizieren.
Ich frage mich jetzt, wie man kernel.get & lt; & gt; unter mehreren Klassen in der Anwendung. Soll ich den Kernel selbst einspeisen?
Persönlich würde ich lieber kernel.inject verwenden, aber wenn ich kernel.inject machen kann, kann ich die Abhängigkeiten sehr wahrscheinlich manuell einfügen, was wahrscheinlich besser ist (Kuss).
Testfälle sind nett, aber sie sind weit von den wirklichen praktischen Problemen entfernt, also hoffe ich, dass Sie mir helfen können, diesen Punkt zu klären. Danke.
Edit: Ich habe bemerkt, dass einige Leute über "root container" sprechen. Es scheint, als wäre es das Konzept, nach dem ich suche. Wie sollte ich einen Root-Container einrichten und die anderen Anwendungsklassen wissen lassen?
Edit2 Beispielcode (bitte vergib Fehler, es ist nur zum Beispiel):
%Vor%Ich habe das noch nicht getestet, weil ich immer noch mit einigen Initialisierungsproblemen kämpfe, aber meine Frage ist, wie kann die Befehlsklasse über SomeOtherClass wissen? Meine derzeitige Hypothese ist, den Kernel in SomeClass zu injizieren und die Methode Inject zu verwenden.
Wenn Sie Ihr Beispiel betrachten, ist klar, dass SomeClass
nicht mit Inversion of Control erstellt wird. Der Tipp ist, dass es eine Abhängigkeit von Command
hat, aber die Kontrolle dieser Abhängigkeit wird in SomeClass
selbst beibehalten. ( Command cmd = new Command();
)
Um das Steuerelement dieser Abhängigkeit zu invertieren, müssten Sie eine Möglichkeit haben, diese Abhängigkeit in SomeClass zu injizieren. Wie Remo Gloor angegeben hat , ist der übliche Weg, dies mit Ninject zu tun, der Konstruktor.
Um dies zu tun, könnten Sie SomeClass in etwas wie diese ändern:
%Vor%Ebenso benötigen Sie Ihren Befehl, um seine Abhängigkeit anzukündigen:
%Vor%Dann würden Sie Ihre Command-Bindung im Kernel registrieren, etwa wie folgt:
%Vor%Der Kernel wäre dann in der Lage, die Abhängigkeitskette zu durchlaufen und sie alle zu injizieren.
Verwenden Sie wo immer möglich Konstruktorinjektion und Fabriken , wenn es ein Gutes gibt Gründen Sie nicht, die Instanzen zusammen mit dem Objekt zu erstellen, das von ihnen abhängt.
kernel.Inject
sollte nur verwendet werden, wenn Sie die Erstellung des Objekts nicht ändern. Z.B. ein WebForm
kernel.Get
sollte genau einmal in Ihrem Kompositionsstammverzeichnis (z. B. Program.Main oder MVC3.DependencyResolver) verwendet werden, um Ihre Anwendung zu erstellen.
Tags und Links inversion-of-control ninject ninject-2