Es gibt eine Diskussion zwischen Betreuern der vorhandenen DI-Bibliotheken, unabhängig davon, ob ein Adapter für das neue integrierte DI-System von ASP.NET erstellt, gewartet und unterstützt wird. Die Autofac-Betreuer haben confirmed, dass sie einen Adapter erstellen und unterstützen werden, während das Ninject-Team silent ist, und andere Teams wie das Simple Injector-Team (das mich einschließt), dass sie keinen Adapter unterstützen.
Persönlich denke ich, dass die integrierte DI-Bibliothek von ASP.NET Core eine schöne und saubere DI-Bibliothek ist, aber es ist auf einfache Anwendungen beschränkt. Wie ich erklärt here, werden viele Funktionen, die für die Entwicklung wartbarer Anwendungen auf der Grundlage der SOLID-Prinzipien erforderlich sind, nicht unterstützt. Genau wie die Unity DI-Bibliothek vor ein paar Jahren, denke ich, dass dieser integrierte Container Entwickler dazu bringen könnte, die Abhängigkeitsinjektion zu verwenden, was für unsere Branche ein Gewinn ist.
Diese Einschränkungen machen den integrierten Container besonders geeignet, das ASP.NET-System selbst zu konfigurieren und zu erweitern. Um große wartbare Anwendungen zu erstellen, müssen Sie eine andere DI-Bibliothek verwenden. Das ist natürlich in Ordnung; Sie müssen die richtigen Werkzeuge für den Job auswählen.
Leider hat das ASP.NET-Team bisher publicly mit einer anderen DI-Bibliothek kommuniziert, dh Sie müssen einen Adapter schreiben/verwenden. Dies ist leider die falsche IMO-Nachricht, da die meisten DI-Bibliotheken nicht mit der API kompatibel sind, die durch den integrierten Container dargestellt wird (wie ich ausführlich here und here erklärt habe). Nur Autofac scheint einigermaßen synchron zu sein, weshalb sich das Autofac-Team für die Wartung eines Adapters entscheidet. Beachten Sie jedoch, dass selbst Autofac sich als nicht kompatibel mit der von Microsoft definierten Abstraktion erwiesen hat und sie (ebenso wie StructureMap) big changes zu ihrem Produkt machen mussten, um die Abstraktion sogar einhalten zu können. Und die Autofac-Betreuer sind severely frustrated über den gesamten Prozess und die Abstraktion im Allgemeinen. Und wie ich here erklärte, ist sogar die von ASP.NET zur Verfügung gestellte Adapter-Implementierung von Ninject gebrochen.
Diese Nachricht vom ASP.NET-Team, einen Adapter zu verwenden, ist IMO ein großer Fehler, weil dies Innovation erstickt (während die DI-Bibliothek selbst nicht; es ist nur eine andere DI-Bibliothek). Der ASP.Das NET-Team bewirbt ein Modell, bei dem sowohl Ihre Anwendungskomponenten als auch das ASP.NET-System (und alle anderen Subsysteme, die zukünftig plugged werden) in Ihrem benutzerdefinierten Container registriert werden. Es ist viel sinnvoller und praktischer, Ihre Anwendungskonfiguration getrennt von der Konfiguration des ASP.NET-Systems zu halten (wie erläutert here).
Aus diesem Grund finde ich die Verwendung eines Adapters für jeden Container eher nutzlos. Wie ich gezeigt habe here ist es wirklich einfach, Ihren eigenen DI-Container zu pluginieren, während es völlig getrennt von ASP.NET-Registrierungen bleibt. Dies bedeutet, dass Sie keine Unterstützung für Ninject benötigen, um Ninject effektiv für ein ASP.NET Core-Projekt verwenden zu können. Das einzige, was Ninject tun muss, ist eine Version zu erstellen, die mit .NET Core kompatibel ist (falls Ihr Produkt auf dieser neuen Plattform laufen muss).
Also bin ich mir nicht sicher, ob die Unterstützung "aussterben", obwohl einige DI-Betreuer (wie das Simple Injector-Team und wahrscheinlich auch Castle Windsor und Ninject) beschlossen haben, nicht zu bauen und zu warten und unterstützen eine Adapterimplementierung für ASP.NET Core, da sie nicht benötigt wird und nur im Weg ist.
UPDATE November 2016
Ich habe discussing some improvements zu ASP.NET-Core mit Microsoft ist es einfacher zu machen, einen Behälter-Plugin, das einen Blick auf meinem example repository keinen Adapter hat (nehmen und vor allem, um die Startup.cs of the Ninject sample project), aber bis jetzt scheint Microsoft den Fortschritt zu blockieren, weil (wie Fowler sich selbst behauptet) ihre "bias towards conforming containers [ist] Clouding [ihre] Vision".
Vielen Dank für die aufschlussreiche Post, die wichtigste Sache, die aus dem eingebauten DI-Container fehlt, gibt es keine Konvention basierte Zuordnung. Ich muss jedes einzelne Projekt in mein Startup-Projekt einbeziehen und die Abhängigkeiten abbilden. Dies scheint wie ein großer Fehltritt, es sei denn, ich vermisse etwas. – Spets
@Spets Der integrierte Container ist speziell als Konfigurationssystem für ASP.NET gedacht. Dies bedeutet, dass Sie Teile von ASP.NET problemlos austauschen können, und Komponenten von Drittanbietern können dasselbe Konfigurationsmodell verwenden. Der integrierte Container ist um dieses Modell herum aufgebaut, und das erklärt, warum einige Features nicht implementiert sind. Beachten Sie, dass Batch-Registrierung sehr einfach ist, sich selbst auf den Container zu schreiben, und um eine überzeugende DI-Bibliothek zu werden, sollten andere wichtigere Funktionen zuerst implementiert werden. Aber missbrauchen Sie nicht das DI-System, um Ihre eigenen Typen zu registrieren. – Steven
Gotcha das macht Sinn. – Spets