Laden...

UserControl in mehreren Projekten verwenden

Erstellt von NovemberRain vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.192 Views
N
NovemberRain Themenstarter:in
98 Beiträge seit 2006
vor 16 Jahren
UserControl in mehreren Projekten verwenden

Hi,

Ich entwickle mehrere Addins für eine Anwendung. Diese Addins verwenden immer das selbe Usercontrol. Ich würde das Usercontrol jetzt gerne zentral vewalten, nur leider geht das nicht so simpel wie ich mir das anfangs dachte.

Das Problem ist folgendes:

Die Addins bestehen jeweils aus einem Projekt, das ganze wird über ein Hauptprojekt in die Anwendung eingebunden welche auch die Kommunikation der Addins mit dem Programm übernimmt. Nun benötigt jedes Projekt eine Command klasse(Interface) die immer gleich ist und eine davon abgeleitete Klasse die für jedes Projekt einzigartig ist. Mein Usercontrol benötigt aber diese abgeleitete Klasse und ruft desöfteren auch Methoden von dieser auf.(z.B. um den Hauptprogramm mitzuteilen das die Aktion beendet ist)

Wie könnte ich jetzt das Usercontrol zentral lagern und zugleich die Einzigartigkeit der abgeleiten Commandklasseen beibehalten?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo NovemberRain,

Mein Usercontrol benötigt aber diese abgeleitete Klasse und ruft desöfteren auch Methoden von dieser auf.

vermutlich sind doch die Methoden aber in der Oberklasse deklariert und in der Unterklasse überschrieben. Oder meinst du echt Methoden, die erst in der Unterklasse definiert sind. Dann hast du ein echtes Problem.

Wenn es aber nur um überschriebene Methoden geht, kann du im UserControl immer den Typ der Oberklasse verwenden. Das Addin braucht dann nur eine Methode, die ein Objekt seiner Command-Klasse liefert.

herbivore

N
NovemberRain Themenstarter:in
98 Beiträge seit 2006
vor 16 Jahren

Hallo herbivore,

ja es sind lediglich überschriebene Methoden. Sie beschreiben ja nur wie sich das Addin zu verhalten hat und gibt die Events des Hauptprogramms durch(Interfaceklasse?).

Im Hauptprojekt werden diese abgeleiteten Klassen dann verwendet um Controls im Hauptprogramm mit den Addins zu verknüpfen. Ich könnte aber den CostumControl die abgeleiteten Steuerelemente beim Erstellen übergeben da diese ja typgleich mit der Oberklassen sein müssten.

Edit: etwas umgeschrieben, hoffe es ist jetzt verständlicher.

915 Beiträge seit 2006
vor 16 Jahren

Du hast mehrere Möglichkeiten um das ganze zu lösen.

Eine Möglichkeit wäre das ganze über Assemblies anzugehen, du könntest z.B. anhand von Commands (Actions) in deinem Usercontrol einen ActionEventHandler deklarierst. Anhand eines gemeinsammen Schnittstellenprojektes das somit sowohl in dem UserControl wie in den Projekten der einzelnen AddIns referenziert ist könntest du dann einen PluginManager schreiben der eben diese Aktionen (deine Basisklassen oder Schnittstellen) beim das Laden über Assembly.Load initalisiert. Der Manager kümmert sich dann darum das die Aktionen je nach Basisklasse oder Schnittstelle entsprechend auf dem UserControl ausgeführt wird. Um das Laden innehralb der Manager Klasse zu realisieren kannst du eine Load Methode schreiben die z.B. über einen Filewatcher und eben beim Load Ereigniss im UserControl selbst aufgerufen wird.

Wenn nun anhand des FileWatcher oder der Load Methode in dieser Manager Klasse ein neues File angesprochen wird, sollte das erste sein wonach du suchst innehralb dieser Datei bzw. Assembly eine gemeinsamme Schnittstelle sein, z.B. IPlugin. IPlugin bietet dann einfach z.B. die Methode OnSetup an an der dann alle Menüs Zeichenroutinen usw. initalisiert werden die der Manager dann im UserControl eben realisiert. Wird nun eine Aktion seitens des AddIns ausgelöst wandert diese über eben das verknüpfte Command an das UserControl über die Managerklasse.

Der Vorteil wäre das dass UserControl nicht direkt in die AddIns referenziert wird und somit nicht direkt reingepfuscht werden kann - klar ist aber dass eine Assembly dann natürlich im selben Process aufgerufen wird und somit natürlich bei den verschiedenen Aktionen aufpassen musst ob diese etwas abarbeitet was dann die GUI blockieren könnte.

Du kannst das auch über Serialisierung gestallten, sogar deine Commands könntest dann serialisieren.

Für Pligin bzw. AddIn / AddOns gibt es viele Patterns, fand das Command Pattern bisher nur am einfachsten.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

N
NovemberRain Themenstarter:in
98 Beiträge seit 2006
vor 16 Jahren

Muss mich entschuldigen ich war die letzten Tage mit der Datenbank beschäftigt und konnte mich nicht um das Usercontrol kümmern. Habe heute das Control in sein eigenes Projekt kopiert und auch die damit verbundenen Klassen(welche nur vom Usercontrol aufgerufen werden) und dabei schon einige Probleme erkannt. Ich habe bis jetzt immer häufig mit den Settings und Resourcenfiles gearbeitet. Soweit ich weiss muss das Steuerelement aber vor dem ersten Einsatz kompiliert werden, also müssen die Settings und Resourcen alle im Projekt des Usercontrols hinterlegt sein. In bestimmten Addins verwende ich aber unterschiedliche Bezeichnungen deswegen werd ich den Umweg gehen und diese Informationen in die Datenbank speichern.

Edit: Hab das ganze so gelöst das ich im Projekt des Usercontrols eine Struktur angelegt hab mit den einzelnen Settings und Resourcen, diese übergebe ich dann immer beim erstellen des Controls. Läuft wunderbar 🙂

@ Andreas

Danke für die ausführliche Antwort, es war durchaus geplant die einzelnen Module beim programmstart auszulesen statt fest zu codieren. Leider fehlte mir bis jetzt die Zeit und mich damit ausführlicher zu Beschäftigen. Ich werde dem aber in den nächsten Tagen mal weiter nachgehen, wenn du irgendwelche Tipps und/oder Anleitungen für mich Parat hättest wär das super 🙂