Für loses Kopplung zählt vor allem, das problemlose Ein- und Ausklinken von Modulen, wenn möglich nur durch das Kopieren und das Entfernen von Assemblys in einem dafür bereitgestellten Ordner. Module werden nicht “hart” aufeinander referenziert und sind so auch von keinem anderen Modul abhängig.
Auch die Rahmenapplikation verweist auf kein Modul, ausgenommen z.B. ein CoreModule welches die Schnittstellen zwischen Applikation und Modul bereitstellt. Diese Methodik verhindert so unnötige Eingriffe in die Rahmenapplikation, bei neuen Modulen oder die die nicht mehr zur Verfügung stehen sollen.
In und mit der Composite Application Library (CAL/PRISM) geht das unter anderem wie folgt:
Im Bootstrapper überschreiben wir die Methode GetModuleCatalog() und geben hier den ModulePath zurück, in den wir später beim kompilieren der Projekte (Module) die entsprechende *.dll automatisch kopieren.
1 2 3 4 5 6 7 8 9 | #region GetModuleEnumerator /// /// Gets the module catalog. /// protected override IModuleCatalog GetModuleCatalog() { return new DirectoryModuleCatalog() {ModulePath = @".\Modules"}; } #endregion |
Im Module, welches wir dann in die Applikation einklinken lassen wollen, legen wir für die ModuleRegisterKlasse das Module-Attribut fest.
1 2 3 4 5 | [Module(ModuleName = "ModuleA")] public class ModuleA: IModule { // } |
Und in den Eigenschaften des ModuleA Projektes legen wir unter Buildereignisse ein PostBuildereignis fest, das die Assembly dann in den Ordner kopiert in welcher die Rahmenapplikation die Module erwartet.
xcopy "$(TargetDir)*.*" "$(SolutionDir)\$(SolutionName)\bin\$(ConfigurationName)\Modules\" /Y
Das wars eigentlich auch schon. Nur wie man dann die losen Module untereinander kommunizieren lässt.. das ist wieder ein anderes Scenario, welches ich aber in Kürze vorstellen möchte. Also wie immer,
viel Spaß beim entwickeln : )







