Ich verwende derzeit NInject, um Schnittstellen an konkrete Typen zu binden und diese in meine Klassen einzufügen. Ich gehe jedoch davon aus, dass dies eine Laufzeit-Angelegenheit ist. Für mich scheint es ein Angriffspunkt zu sein, wenn jemand das Verhalten meiner Anwendung ändern wollte.Kompilierzeit/Post-Build Dependency Injection IoC?
Gibt es irgendetwas, was es mir erlauben würde, meine Dependency-Injection-IoC zur Kompilierzeit zu migrieren (Lesen: Post-Build IL Weaving/Replacement)?
Um
In meinem Code ich ein Setup-Bindung
Bind<IFoo>().To<Foo>()
Bind<Bar>().ToSelf().InSingletonScope();
mit Ctor Foo(Bar dependency)
An der Wurzel meiner Anwendung Elaborate (bei Inbetriebnahme) I Auflösen des Graphen
var foo = kernel.Get<IFoo>();
Angenommen ich keine Service-Locators (anti-pattern anyway right?) haben. Also habe ich keine Verwendung mehr für kernel
.
Jetzt möchte ich eine "post-build release-compile" haben, die die Auflösungsengine des Kernels durch Instanciator oder Verweise auf constant/singleton usw. ersetzt. So, dass mein Code so aussieht;
var foo = kernel.Get<IFoo>();
In Wirklichkeit nach IL Ersatz in meinem letzten Build-Bühne, sieht es wie folgt aus:
var bar = new Bar();
var foo = new Foo(bar);
Und es gibt keinen Hinweis auf ninject mehr.
Meine rationale für diese Frage ist, dass ich Fody IL Weave alle meine PropertyChanged Raiser verwenden und ich frage mich, ob es möglich wäre, etwas Ähnliches für Dependency Injection zu tun.
Sind die Ninject-Abhängigkeitsregistrierungen in XML oder im Code? –
Könnten Sie bitte genauer erklären, was die Kompilierzeit-Injektion ist? –
Ich nehme an, dass Ihre Konfiguration für Ihre DI in Code über die Module erfolgt. So erhalten Sie bereits die Kompilierzeitsicherheit, auch wenn die DI-Verbindung zur Laufzeit stattfindet. Das geht jedoch in einer Tangente, wenn wir uns das Problem ansehen, das Sie vorschlagen ** Meine DI geschieht zur Laufzeit, aber ich möchte, dass sie zur Kompilierzeit stattfindet **, warum sollten Sie Dependency Injection überhaupt verwenden? ? Sie können auch die Module einfach entfernen und Instanzen oder Fabriken einfach manuell den Implementierungen zuweisen, so dass es keinen Runtime * Angriffspunkt * gibt. Für mich ist der halbe Grund, warum Sie DI verwenden, die Laufzeitkonfiguration – Grofit