Frage zu: Microkernel / Contract-First-Design



  • Hi Leuts!

    Ich beschäftige mich momentan mit dem Thema "Microkernel / Contract-First-Design". An für sich bin ich davon doch recht angetan. Es hat schon was über Konfigurationen die jeweilige konkrete Implementierung auszuwählen und anzusteuern.

    Die Umsetzung ist im Prinzip nicht das Problem, da der Mikrokernel nur die Bindings hält und anhand dieser die Objekte aus den Resourcen erstellt und wieder gibt.

    Die Aufteilung und Interaktion der Kompoenten ist da eher ein Problem für mich, jedenfalls vom Verständnis her.

    Ich möchte dies mal anhand eines kleinen Beispiels besser verdeutlichen:

    In einer DVD-Archivierungssoftware gibt es Benutzer, Benutzergruppen, mehrere Datenbanken, mehrere Logging-Protokolle, Dateiablage für DVD-Images und natürlich die DVD-Verwaltung selbst.

    Bisher habe ich das immer wie folgt gelöst: Eine "application"-Klasse als Singleton, welche als Attribute und Getter die Objekte wie "Aktueller Benutzer", "Aktuelles Logging-Protokoll", "Aktuelle Datenbankverbindung", usw. hatte. Also praktisch ein Monolithic Kernel. Jede "Komponente" kann also via "application::instance()->log()" auf das aktuelle Protokoll zugreifen und etwas loggen.

    Wenn ich das nun richtig verstanden habe, geht so etwas bei einem Microkernel nicht mehr, da er keine Objekte sichert sondern nur Bindings um Komponenten zu laden, Objekte davon zu erstellen und diese dann wieder zu geben.

    Meine Frage ist nun: Wo und wie halte ich diese "globalen" Objekte? Eine Komponente wie z. B. die Benutzerverwaltung benötigt u. A. die Komponente für Datenbanken, diese kann ich natürlich über eine Setter-Methode setzen, ebenso wie das Log. Jedoch kann ich nicht immer über den Microkernel ein neues Datenbank-Objekt beziehen, da dies zur Folge hat, dass dieses immer wieder neue Datenbankverbindungen aufbaut. Im Microkernel speichern kann ich diese Objekte nicht, da ich zwischenzeitlich auch Verbindungen zu einer anderen Datenbank aufbauen muss.

    Meine Idee wäre nun: Ich schreibe mir eine application-Klasse wo ich diese "globalen" Objekte sichere und in dieser Klasse ist auch eine Instanz des Microkernels. Persönlich bin ich nicht sehr von dieser Idee überzeugt, drum frage ich.

    Hoffe ihr könnt mir da 1-2 Denkanstöße geben.

    Viele Grüße,
    Lumi



  • Lumi schrieb:

    Jedoch kann ich nicht immer über den Microkernel ein neues Datenbank-Objekt beziehen, da dies zur Folge hat, dass dieses immer wieder neue Datenbankverbindungen aufbaut. Im Microkernel speichern kann ich diese Objekte nicht, da ich zwischenzeitlich auch Verbindungen zu einer anderen Datenbank aufbauen muss.

    du brauchts doch nur nen api-call aufrufen db(ip,port,query) den verbindungsauf- und abbau übernimmt dann das modul. wie und wann eine db-verbindung geschlossen wird, musst du dir dann eben überlegen. evtl. ein max_connection_limit und dann wird die seltenste verbindug geschlossen. oder eben wenn das modul entladen wird alle.
    (alternativ bietest nen api-call zum öffen einer verbindung, die wiederum eine verbindungskennung liefern, die du deinem query und close api-call übergibst)

    Lumi schrieb:

    Eine Komponente wie z. B. die Benutzerverwaltung benötigt u. A. die Komponente für Datenbanken

    das ist imho falsch. die benutzerverwaltung benötigt nur eine schnittstelle zum kernel, über diesen wird dann die datenbank abgefragt.

    hoffe ich bin jetzt nicht total am thema vorbei 😕



  • Hey!

    Danke für deine Antwort.

    Bei deinem Vorschlag mit dem API-Call habe ich jedoch das Problem, dass ich keine parallelen Datenbankverbindungen aufbauen kann. Bei dem ganzen open/close raucht mir glaube ich die Performance ab. 😉

    Bzgl. mit der Schnittstelle zum Kernel. Ich habe einige "unvollständige" PDFs und Präsis im netz gefunden die zwar das "Microkernel Pattern" beschreiben, jedoch irgendwie alle das Selbe sind und aus einem Buch abgeschrieben sind. Angewantes sieht anders aus.

    Darum halte ich mich momentan an dies hier, was speziell auf das Contract-First-Design eingeht:
    http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=118769069

    Leider wird mir dort die Anwendung des Microkernels in einer Anwendung zu oberflächlich erläutert. Die meisten Blog-Einträge und Podcasts gehen leider _nie_ über das Stadium des Ladens einer Komponente hinaus. Von Anwendung und Interaktion keine Infos 😞



  • Lumi schrieb:

    Bei deinem Vorschlag mit dem API-Call habe ich jedoch das Problem, dass ich keine parallelen Datenbankverbindungen aufbauen kann. Bei dem ganzen open/close raucht mir glaube ich die Performance ab. 😉

    wieso nicht? natürlich ist das möglich. du musst ja nicht nach jedem query die verbindung schließen. mach das nach ner idle zeit o.ä.

    könnte mir vorstellen, dass microkernel noch nicht so oft umgesetzt wurde und daher auch dazu nicht viel zu finden ist. ich kenn mich damit leider auch nicht aus 😞


Anmelden zum Antworten