Warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: SELECT * FROM variable in /var/www/web1030/html/mkernel.de/includes/database.mysql.inc on line 128

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 726

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 727

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 728

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 729
[Coder's Implementation{C#}] Plugin-Architektur 1.0 | Drupal

[Coder's Implementation{C#}] Plugin-Architektur 1.0

  • warning: Cannot modify header information - headers already sent by (output started at /var/www/web1030/html/mkernel.de/includes/database.mysql.inc:128) in /var/www/web1030/html/mkernel.de/includes/common.inc on line 148.
  • user warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: UPDATE variable SET value = 'a:17:{i:0;i:62;i:1;i:61;i:2;i:59;i:3;i:31;i:4;i:30;i:5;i:29;i:6;i:24;i:7;i:21;i:8;i:15;i:9;i:14;i:10;i:11;i:11;i:7;i:12;i:6;i:13;i:5;i:14;i:3;i:15;i:2;i:16;i:1;}' WHERE name = 'menu_masks' in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 609.
  • user warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: UPDATE variable SET value = 'a:0:{}' WHERE name = 'menu_expanded' in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 609.
  • user warning: Table './usr_web1030_3/variable' is marked as crashed and should be repaired query: DELETE FROM variable WHERE name = 'menu_rebuild_needed' in /var/www/web1030/html/mkernel.de/includes/bootstrap.inc on line 634.

Als ersten Artikel unter dem Tag "Coder's Implementation {LANG}" beschäftige ich mich mit dem Umsetzen der in [Coder's Concept] Plugin-Architektur (v 1.0) beschriebenen Plugin-Architektur, in C#. Alle Artikel mit diesem Tag beziehen sich auf einen Artikel mit dem Tag "Coder's Concept". Implementierungsartikel versuche ich mit Klassendiagrammen zu anzureichern.

Projektstruktur

Das Projekt enthält drei Unterprojekte:

  1. TodoShared
  2. TodoApp
  3. DoneFilter

TodoShared

Das erste Projekt enthält die Typen, die vom Programm und von Plugins benötigt werden. Darin enthalten sind eine Klasse (Task) und eine Schnittstelle (ITaskFilter).

Die Schnittstelle muss von allen Plugins implementiert werden und wird als Anker vom Programm benutzt, um eine Liste der geladenen Plugins zusammenzustellen. Alle anderen Projekte referenzieren dieses Projekt. Dadurch sind diese beiden Typen in den beiden anderen Projekten verfügbar.

TodoApp

Das zweite Projekt enthält den Quellcode für das Pluginbasierte Programm.

Dieses Projekt besteht aus 5 nennenswerten Klassen:

  1. Program
    Hier werden alle Plugins, die in einem bestimmten Ordner liegen, geladen und eine Liste mit verfügbaren Filtern angelegt.
  2. Document
    Diese Klasse enthält eine Liste von Aufgaben und die dazugehörenden Verwaltungsfunktionen. Es wird ein Ereignis zur Verfügung gestellt, das immer dann feuert, wenn sich das Dokument ändert.
  3. DocumentView
    Ein Dialog, der ein Document-Objekt unter Anwendung eines Filters (also eines Plugins) anzeigt.
  4. MainWindow
    Das Hauptfenster, das Operationen wie "neu", "laden" und "speichern" realisiert.
  5. EverythingFilter
    Da DocumentView-Objekte immer einen Filter benötigen, gibt es fest einen Filter, der alle Aufgaben eines Dokuments passieren lässt. Er realisiert die ungefilterte Ansicht.

DoneFilter

Dieses Projekt enthält einen einfachen Filter, der nur bereits erledigte Aufgaben passieren lässt. Wichtig sind die Projekteinstellungen:

Damit der Filter zur Verfügung steht, muss er in das plugins-Verzeichnis kopiert werden, von wo aus er von der Klasse Program im Projekt TodoApp geladen wird. Daher ist es notwendig, dass dieser Ordner im Unterverzeichnis bin/debug existiert. In der an diesem Artikel verlinkten Zip-Datei ist der Ordner vorhanden.

Assemblies zur Laufzeit laden

Assemblies nachträglich zu laden ist einfach.

string[] filenames = Directory.GetFiles(Directory.GetCurrentDirectory()+"\plugins");
foreach (string filename in filenames)
{
Assembly asm = Assembly.LoadFile(filename);
foreach (Type t in asm.GetTypes())
{
if (t.IsClass && t.GetInterface(typeof(ITaskFilter).Name).Equals(typeof(ITaskFilter)))
{
plugins.Add((ITaskFilter)t.GetConstructor(Type.EmptyTypes).Invoke(null));
}
}
}

Zunächst werden alle potentiellen Assemblies festgestellt (das erledigt das äußerste foreach) und geladen. Danach werden alle Typen in dem geladenen Assembly betrachtet. Wenn es sich um eine Klasse handelt und das notwendige Interface implementiert wird, so wird das Objekt instanziert und abgelegt. Innerhalb des Programms wird immer nur über das Interface mit den Plugins kommuniziert.

Der angehängte Code ist kommentiert und sollte keine Fragen offen lassen.