Architektur für die Extension / Plugin-Kommunikation

Sobald das Problem des Ladens von Plugins gelöst ist (in .NET über MEF, falls nicht anders angegeben), ist der nächste zu lösende Schritt die Kommunikation mit ihnen. Die einfache Möglichkeit besteht darin, eine Schnittstelle zu implementieren und die Plug-in-Implementierung zu verwenden. Manchmal muss das Plug-in jedoch nur die Funktionsweise der Anwendung erweitern, und es gibt möglicherweise viele Erweiterungspunkte.

Meine Frage ist, wie man mit diesen Erweiterungspunkten umgeht. Ich habe verschiedene Möglichkeiten gesehen, aber ich bin mir nicht sicher, welche Vor- und Nachteile die einzelnen haben und ob es mehr und bessere Möglichkeiten gibt, dies zu erreichen:

Ereignisse: Hinzufügen statischer Ereignisse zu allem, was "erweiterbar" sein soll. Wenn ich beispielsweise eine benutzerdefinierte Validierung für eine Benutzerklasse hinzufügen möchte, kann ich eine statische Ereignisbehandlungsroutine für OnValidation hinzufügen und Ereignisse aus dem Plug-in hinzufügen, wenn es erstellt wird.Messaging: Einen Bus und Nachrichten haben. Das Plugin kann eine bestimmte Nachricht abonnieren und Aufgaben ausführen, wenn eine andere Klasse diese Nachricht veröffentlicht. Die Nachricht sollte den Kontext enthalten, in dem das Plugin arbeiten kann. Im Überprüfungsfall veröffentlicht die Logikschicht eine UserValidation-Nachricht und das Plugin wird aktiv, wenn die Nachricht empfangen wird.Schnittstellen: Die Host-Anwendung ist dafür verantwortlich, alle Plugins aufzurufen, die bestimmte Schnittstellen implementieren, und ihnen den Kontext der aktuellen Operation zu 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? Welches hat für Sie am besten funktioniert?

Und bevor Sie danach fragen, ist unsere Anwendung ein erweiterbarer Kern (Benutzer-, Rola- und Inhaltsverwaltung), um darüber hinaus unsere kundenspezifischen inhaltsbezogenen Webanwendungen zu erstellen. Alles basiert auf ASP.NET MVC.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage