2010-07-25 7 views
5

Meine Anwendung sollte erweiterbar sein. Für meine eigenen Bedürfnisse habe ich einige Dienste implementiert. Diese Dienste basieren auf dem IoC/DI-Prinzip. Die Dienste kapseln also das Konzept der Anwendung ein.Best Practices für die Implementierung einer Add-in/Addon/Plugin-Strategie

Zum Beispiel gibt es einen IApplicationService. Der ApplicationService gibt Informationen über die aktuelle ausgehende Anwendung aus. Dort sind die AssemblyInfo usw. angegeben. Ein anderes Beispiel ist der INavigationService (siehe mef.codeplexcom in den Beispielen). Dieser Dienst stellt einige Eigenschaften zur Verfügung, die Informationen über das aktuell ausgewählte Objekt und einige Ereignisse enthalten.

Ich denke, dass die "Service-Ansatz" ist die einfachste und vereinfacht die Erweiterungspunkte für die Anwendung. Ich bin mir also nicht sicher, ob das wirklich der beste Ansatz ist. Was denken Sie? Wie würden Sie "Erweiterungspunkte" in einer Anwendung wie Addins/Addons/Plugins implementieren?

Vielen Dank im Voraus für Ihre Antworten! Und tut mir leid, mein Englisch ist schlecht. ;)

Antwort

4

Kennen Sie sich mit MEF (Managed Extensibility Framework)?

Das Managed Extensibility Framework (kurz MEF) vereinfacht die Erstellung von erweiterbaren Anwendungen. MEF bietet Erkennungs- und Kompositionsfunktionen, mit denen Sie Anwendungserweiterungen laden können.

2

Sie müssen sich ernsthaft MEF ansehen - das Managed Extensibility Framework.

Es ist ein großartiges neues Framework, das Microsoft selbst zum Beispiel unter Verwendung von in Visual Studio 2010 für seine Erweiterbarkeit Geschichte. Großartig und einfach zu bedienen - warum erfinden Sie das Rad neu, wenn Sie etwas verwenden können, das Tausende von Entwicklern in Kürze verwenden werden?

0

Ja, ich kenne MEF. Ich benutze auch das Konzept von MEF, aber da einige Nachteile. Meine Anwendung ist IoC/DI wie und zusammen mit MEF ist ein bisschen kompliziert. MEF ist nicht wirklich ein DI-Container, so dass es schwierig ist, MEF mit einem anderen DI-Container (z. B. ninject, unity, ...) zu verwenden. Ich werde MEF nicht mit anderen DI-Containern verwenden. So ist es nicht wirklich gut, MEF mit anderen DI-Containern zu mischen.

Ich hoffe, Sie können meine Bedenken verstehen.

Zusatz: Das Laden von Erweiterungen in eine AppDomain in MEF ist nicht möglich. Das ist also für meine Bedürfnisse nicht gut. System.AddIn oder MAF unterstützt dies, aber ich werde nicht System.AddIn verwenden, weil das sehr schwer ist ....

+2

Wenn Sie Informationen hinzufügen möchten, ** aktualisieren ** Sie Ihren ursprünglichen Beitrag, indem Sie ihn bearbeiten - fügen Sie keine eigene Antwort hinzu - macht es schwerer zu folgen ... –

+0

Ja, MEF ist ** nicht ** a DI-Container - da unterscheidet sich seine Aufgabe von einem DI-Container. Aber ich stimme nicht zu - Mischen von MEF und einem DI-Container (wie StructureMap oder Unity) ist wirklich nicht so schwer und kann ganz gut gemacht werden. Sie müssen vielleicht genauer erklären, warum Sie nicht denken, dass dies für oyu funktionieren würde ... –

+0

Das Laden in eine AppDomain zu verwalten ist nicht-trivial und ich denke nicht, dass die meisten DI-Frameworks das auch handhaben werden. Alle Ihre Dienste müssen zum Überschreiten der AppDomain-Grenze weitergeleitet werden. Dies bedeutet auch, dass alle Klassen, die hin- und hergehen, entweder MarshalByRef oder Serializable sein müssen.Sie können erwägen, eine Kategorie von "vertrauenswürdigen" Erweiterungen (ohne Marshalling) und eine andere Kategorie von "nicht vertrauenswürdigen" Erweiterungen, die nur Zugriff auf eine begrenzte Anzahl von Marshalling-Diensten erhalten. –