Ein sich wiederholendes Thema in meiner Entwicklungsarbeit war die Verwendung oder Erstellung einer internen Plug-In-Architektur. Ich habe gesehen, wie es auf viele Arten angegangen wurde - Konfigurationsdateien (XML, .conf usw.), Vererbungsframeworks, Datenbankinformationen, Bibliotheken und andere. Durch meine Erfahrung:
- Eine Datenbank ist kein großartiger Ort, um Ihre Konfigurationsinformationen zu speichern, insbesondere wenn sie mit Daten vermischt sind
- Um dies mit einer Vererbungshierarchie zu versuchen, sind Kenntnisse über die zu codierenden Plug-Ins erforderlich, was bedeutet, dass die Plug-In-Architektur nicht allzu dynamisch ist
- Konfigurationsdateien eignen sich gut für die Bereitstellung einfacher Informationen, können jedoch nicht mit komplexeren Verhaltensweisen umgehen
- Bibliotheken scheinen gut zu funktionieren, aber die Einwegabhängigkeiten müssen sorgfältig erstellt werden.
Da ich von den verschiedenen Architekturen lernen möchte, mit denen ich gearbeitet habe, suche ich auch bei der Community nach Vorschlägen. Wie haben Sie eine SOLID-Plug-In-Architektur implementiert? Was war Ihr schlimmster Fehler (oder der schlimmste Fehler, den Sie gesehen haben)? Was würden Sie tun, wenn Sie eine neue Plug-In-Architektur implementieren würden? Welches SDK oder Open Source-Projekt, mit dem Sie gearbeitet haben, ist das beste Beispiel für eine gute Architektur?
Einige Beispiele, die ich selbst gefunden habe:
- Perls Modul :: Plugable und IOC für die Abhängigkeitsinjektion in Perl
- Die verschiedenen Spring-Frameworks (Java, .NET, Python) für die Abhängigkeitsinjektion.
- Eine SO-Frage mit einer Liste für Java (einschließlich Service Provider-Schnittstellen )
- Eine SO-Frage für C ++, die auf einen Artikel von Dr. Dobbs verweist
- Eine SO-Frage zu einer bestimmten Plugin-Idee für ASP.NET MVC
Diese Beispiele scheinen mit verschiedenen Sprachstärken zu spielen. Ist eine gute Plugin-Architektur unbedingt an die Sprache gebunden? Ist es am besten, Tools zu verwenden, um eine Plugin-Architektur zu erstellen, oder dies auf eigenen folgenden Modellen zu tun?