Hallo,
ich hab mal eine Frage zu einer Struktur, wie sie am logischsten aufgebaut werden sollte.
Ich verwende aktuell eine Plugin Architektur in der Plugins relativ eigenständig sind.
Jetzt will ich Daten aus dem Hauptprogramm den Plugins zur Verfügung stellen, nur habe ich mehr Daten, als ein bestimmtes Plugin brauch.
Als Beispiel habe ich 1000 Einträge in x Tabellen in einer Datenbank, das Plugin brauch aber nur x Einträge aus n Tabllen,mit einem bestimmten Typ,wobei sich Änderungen im Plugin auch auf die Datenbank auswirken sollen.
Also stellt sich die Überlegung ob ich den Plugins die Datenbankconnection geben soll und jedes Plugin selber die Daten verarbeitet(redundanz?) oder lieber im Hauptprogramm bei jedem Plugin eventbasiert prüfen soll welche Daten weitergegeben werden sollen und diese dann in einer Liste bereitstellen ?
Mir stellt sich die Frage wie man das logisch umsetzt, also eine 2 wege kommunikation von Plugin zu Host mit nicht wirklich festgelegten Daten.
(Mit nicht wirklich meine ich, dass jedes Plugin andere Daten in verschiedenen Mengen benötigt und auch auf Bedarf abrufen kann)
Das kommt auf deine Architektur an. Anfangen würde ich damit, den Zugriff auf die Daten (Files, SQL, etc.) über Repository Patterns zu wrappen The Repository Pattern Example in C#
Dann hast du die Möglichkeit in den Plugins relativ einfach Daten zu lesen und zu schreiben, ohne dass du dich um die Details kümmern musst.
Natürlich musst du den Plugins die Repositories übergeben, dafür bietet sich Dependency Injection an Dependency Injection: A Beginner’s Guide
Im Prinzip bietet deine Anwendung dann Dienste an, wie zum Beispiel die Repsositories oder irgendwelche "Manager", die dann von den Plugins angefordert und verwendet werden.
Wenn deine Plugins sehr eigentständig sind, wie zum Beispiel in einem Weblog, dann sollten sie natürlich auf komplett selbst für die Datenverwaltung inklusive Anlegung von Tabellen etc. verantwortlich sein. Bzw. es ist auch möglich beides zu kombinieren.
ImageTools for Silverlight: http://imagetools.codeplex.com | http://www.silverdiagram.net | http://www.cleancodedeveloper.de b:::
Ich nutze die Variante, dass das Plugin bei der Hauptassembly nach Daten fragt und diese liefert.
Ich fände es recht unglücklich, wenn mein Plugin direkt mit ner DB kommunizieren dürfte/könnte.
Andererseits, schaut man sich zB Miranda an, hat jedes Plugin für ein Protokoll die Möglichkeit selbstständig eine Verbindung aufzubauen.
Sei es drum, für DB Zugriffe würde ich die Variante Plugin fragt Main bevorzugen
Hallo Ahrimaan,
da die Host-Anwendung üblicherweise die Plugins kennt, sollten die Plugins nicht die Host-Anwendung kennen, um zyklische Abhängigkeiten zu vermeiden. Das ist aber auch gar nicht nötig, wenn die Host-Anwendung dem Plugin ein Repository-Objekt übergibt, wie es malignate vorgeschlagen hat.
herbivore
Hallo Herbivore,
ja ich gebe dir Recht.
Im falle unseres Programms haben die Plugins aber Events, an die sich der Host "klammert"
Das Plugin feuert dann, wenn es Daten benötitgt, das Event ab und der Host reagiert.
Von daher kenne sich beide nicht sondern nur das Interface
Danke für die sinvollen Antworten.
Ich werde das mit den Repos mal durchlesen und versuchen umzusetzen.