Einführung eines IoC-Containers in den Legacy-Code

10

Ich schreibe eine neue .NET-Bibliothek für den internen Gebrauch in meinem Unternehmen, die IoC durch Dependency Injection verwenden wird. Natürlich ist diese Bibliothek viel einfacher zu verwenden, wenn wir einen IoC-Container zum Auflösen von Instanzen verwenden.

Der Code, der Aufrufe in diese Bibliothek ausführt, verwendet derzeit jedoch NICHT Dependency Injection, und das Refactoring des Legacy-Codes zur Verwendung von DI ist für mein Projekt nicht möglich. Also, was ist der beste Weg, um einen Container in diesem alten Code zu verwenden, um Instanzen aus meiner neuen Bibliothek zu bekommen?

Wenn möglich, möchte ich den Legacy-Code nicht mit harten Referenzen auf den IoC-Container, den ich auswähle, in Verbindung bringen. Da ich relativ neu in DI bin, ist es ziemlich wahrscheinlich, dass wir unsere Meinung darüber ändern werden, welchen Container wir irgendwann verwenden wollen.

Wenn ich meinen Container in etwas wie die CommonServiceLocator-Bibliothek auf CodePlex einbinden würde, wäre das ein vernünftiger Ansatz?

Was haben andere Leute getan?

    
Craig Vermeer 15.01.2009, 17:36
quelle

2 Antworten

4

Sie können ein DI-Container mit einem Fassaden- / Proxy-Muster aus Ihrem Legacy-Container ausblenden. Sie vererben im Wesentlichen Ihr Vermächtnis an eine benutzerdefinierte Klasse, die Sie implementieren, die über den DI-Container wissen wird. Jetzt, wenn Sie Ihre DI ändern, aktualisieren Sie Ihre Fassaden nicht Ihren alten Code.

Ich habe nicht viel in Common Service Locator recherchiert, aber seine Prämisse könnte eine gute Lösung sein. Eventuell möchten Sie Ihre Fassade mit der CSL verbinden, damit wird das DI-Konzept vollständig aus Ihrem Legacy-Code ausgeblendet.

    
JoshBerke 15.01.2009, 18:20
quelle
2

Wenn ich Ihre Frage verstehe, möchten Sie DI-aktivierten Code aus Legacy-Code aufrufen.

Die beste Option ist, die neue Bibliothek DI Friendly, aber container- beizubehalten. Agnostiker .

Dadurch können Sie eine einfache Fassade bereitstellen, die der Legacy-Code verwenden kann. Es ist nicht erforderlich, dass die Legacy-App einen DI-Container verwendet und der Common Service Locator nicht benötigt wird.

    
Mark Seemann 20.01.2010 21:47
quelle