Sobald das Problem des Ladens von Plugins gelöst ist (in .NET durch MEF in out Fall), ist der nächste Schritt zu lösen, die Kommunikation mit ihnen. Der einfache Weg besteht darin, eine Schnittstelle zu implementieren und die Plugin-Implementierung zu verwenden, aber manchmal muss das Plugin nur die Art und Weise erweitern, wie die Anwendung funktioniert, und es kann viele Erweiterungspunkte geben.Architektur für Erweiterung/Plugin-Kommunikation
Meine Frage ist, wie man mit diesen Erweiterungspunkten umgehen. Ich habe verschiedene Möglichkeiten gesehen, dies zu tun, aber ich bin nicht sicher, ob der Vor-und Nachteile eines jeden und wenn es mehr und bessere Möglichkeiten, um dies zu erreichen:
- Events: Hinzufügen von statischen Events zu allen Sachen wir wollen "erweiterbar" machen. Wenn ich z. B. eine benutzerdefinierte Überprüfung für eine Benutzerklasse hinzufügen möchte, kann ich einen statischen OnValidation-Ereignishandler hinzufügen und ihm Ereignisse aus dem Plug-in hinzufügen, wenn es erstellt wird.
- Messaging: Mit einem Bus und Nachrichten. Das Plugin kann eine bestimmte Nachricht abonnieren und Dinge tun, wenn eine andere Klasse diese Nachricht veröffentlicht. Die Nachricht sollte den Kontext enthalten, in dem das Plugin funktionieren kann. Im Validierungsfall veröffentlicht die Logikschicht eine UserValidation-Nachricht und das Plug-in reagiert, wenn die Nachricht empfangen wird.
- Schnittstellen: Die Host-Anwendung ist verantwortlich für den Aufruf aller Plugins, die bestimmte Schnittstellen implementieren und ihnen den Kontext der aktuellen Operation geben. Im Falle einer Validierung kann das Plugin einen IValidator oder IUserValidator mit einer Validate-Methode (Objektkontext) implementieren.
Haben Sie jemals einen der exponierten Ansätze verwendet? Welche hat am besten für dich funktioniert?
Und bevor Sie fragen, ist unsere Anwendung ein erweiterbarer Kern (Benutzer, Rola und Content-Management), um unsere kundenspezifischen Content-Centric-Web-Anwendungen darüber hinaus zu bauen. Alles basiert auf ASP.NET MVC.
Schnittstellen wären wahrscheinlich mein Ansatz, obwohl es von der Anwendung abhängt und es Plugin benötigt. Aber es ist eine sehr saubere Möglichkeit, Plugins zu machen, und es wird auch einfach sein, Ausnahmen vom Plugin zu isolieren. –