Ich habe in mehreren Quellen gelesen, darunter in Mark Seemanns 'Ploeh'-Blog, wie die richtige Platzierung des Kompositionsstamms eines IoC-Containers so nah wie möglich am Einstiegspunkt einer Anwendung liegt.
In der .NET-Welt werden diese Anwendungen häufig als Webprojekte, WPF-Projekte, Konsolenanwendungen und Dinge mit einer typischen Benutzeroberfläche (sprich: keine Bibliotheksprojekte) angesehen.
Verstößt es wirklich gegen diesen weisen Rat, die Kompositionswurzel am Einstiegspunkt eines Bibliotheksprojekts zu platzieren, wenn sie den logischen Einstiegspunkt einer Gruppe von Bibliotheksprojekten darstellt, und der Kunde einer Projektgruppe wie dieser ist die Arbeit eines anderen , dessen Autor das Kompositionsstammverzeichnis nicht zu seinem Projekt hinzufügen kann oder will (sogar ein UI-Projekt oder ein weiteres Bibliotheksprojekt)?
Ich bin mit Ninject als IoC-Container-Implementierung vertraut, aber ich stelle mir vor, dass viele andere auf die gleiche Weise arbeiten, indem sie nach einem Modul suchen können, das alle erforderlichen Bindungskonfigurationen enthält. Dies bedeutet, dass ich ein Bindungsmodul in ein eigenes Bibliotheksprojekt einfügen könnte, um es mit der Ausgabe meines Hauptbibliotheksprojekts zu kompilieren. Wenn der Client die Konfiguration ändern wollte (in meinem Fall ein unwahrscheinliches Szenario), könnte er eine Ersatz-DLL einfügen, um die zu ersetzen Bibliothek mit dem Bindungsmodul.
Dies scheint zu vermeiden, dass die häufigsten Clients überhaupt mit Abhängigkeitsinjektion und Kompositionswurzeln zu tun haben, und würde die sauberste API für die Bibliotheksprojektgruppe ergeben.
Dies scheint jedoch angesichts der konventionellen Weisheit in dieser Frage zu fliegen. Ist es nur so, dass die meisten Ratschläge davon ausgehen, dass der Entwickler auch eine gewisse Koordination mit der Entwicklung der UI-Projekte hat, und nicht mein Fall, in dem ich nur Bibliotheken entwickle, die andere verwenden können?
Das Schöne an externen Bibliotheken ist, dass sie tun sollten, was immer sie sagen, und gleichzeitig eine einfache, unkomplizierte Oberfläche bereitstellen. Wie komplex es tatsächlich ist, sollte es nicht Sache des Entwicklers sein, der es implementiert. Wenn DI die Arbeit des API-Entwicklers tatsächlich weniger komplex macht, ist es zu 100% sinnvoll, sie zu verwenden, solange sie ordnungsgemäß verwendet wird und ihr Modul am Einstiegspunkt der API deklariert wird. Bei der Entwicklung einer MVC-App vor kurzem habe ich die Datenschicht mithilfe eines Repository-Musters abstrahiert und noch weiter abstrahiert, indem ich eine Service-Schicht zwischen der MVC-App und der Repository-Schicht platziert habe, beides Klassenbibliotheksprojekte. Ich hatte eine ICache-Schnittstelle, die einer Cache-Klasse für meinen Dienstkontext zugeordnet war. Ich habe es ursprünglich mit MVC.Web.Cache implementiert, aber bei einer späteren Iteration habe ich es gegen System.runtime ausgetauscht. Cache und Sie können sich nur vorstellen, wie groß der Umfang dieses Refactors ohne meine Verwendung von DI gewesen wäre. Also mein Rat; "Tue es".
quelle