Momenteel werk ik aan een project dat een basis platform behelst met daarbovenop als content schermen. Ik wil dat deze schermen als compleet onafhangelijk project moeten kunnen worden geïmplementeerd en alleen middels interface implementatie met het systeem 'communiceren'.
Dit alles zit er al in, schermen worden dynamisch van schijf geladen middels assembly load, geinstantieerd en een menu opgebouwd van schermen die aanwezig zijn.
Nu wil ik dat de schermen functionaliteiten van het basis systeem gaan gebruiken maar dus niet een referentie naar een echte implementatie dll van het basis platform maar middels een interface en op een backwards compatible manier.
Mijn eerste oplossing was:
Er is een Scherm interface die twee methoden gefineerd: GetRequiredInterfaceVersion() en RegisterBasePlatformObject(IPlatformObject)
Deze interface zal nooit wijzigen en hiermee zou het basis platform een object kunnen registreren die de basis platform interface versie (IPlatformObject) implementeerd die het Scherm verwacht.
In IPlatformObject zitten dus functies die sterk onderhevig zullen zijn aan veranderingen.
Dit gaat allemaal goed, zelfs met nieuwe IPlatformObject versies die nieuwe methoden of methoden met nieuwe signiture toevoegen aan de interface.
Maar nu, er zullen methode namen aangepast gaan worden of zelfs verwijderd. Nu zou ik graag na het aanroepen van GetRequiredInterfaceVersion() een object aanbieden die aan de hand van een Adapter design pattern het oude gedrag aanbied aan het scherm, dus de vertaalslag van oude interface naar nieuwe interface.
Op deze manier zullen nieuwe platform versies 100% backwards compatible zijn met oude interface versies.
De interface naam wil ik niet veranderen (dus IBasePlatformV1 enzovoorts) is geen optie. Reflection is ook geen optie, zal wel werken maar valt niet onder categorie 'goede code' IMHO.
Hoe kan ik een object aan het scherm aanbieden die de oude interface implementeerd en toch dezelfde interface naam heeft of beter een alternatief design pattern dat dit probleem op een goede manier oplost?
Dit alles zit er al in, schermen worden dynamisch van schijf geladen middels assembly load, geinstantieerd en een menu opgebouwd van schermen die aanwezig zijn.
Nu wil ik dat de schermen functionaliteiten van het basis systeem gaan gebruiken maar dus niet een referentie naar een echte implementatie dll van het basis platform maar middels een interface en op een backwards compatible manier.
Mijn eerste oplossing was:
Er is een Scherm interface die twee methoden gefineerd: GetRequiredInterfaceVersion() en RegisterBasePlatformObject(IPlatformObject)
Deze interface zal nooit wijzigen en hiermee zou het basis platform een object kunnen registreren die de basis platform interface versie (IPlatformObject) implementeerd die het Scherm verwacht.
In IPlatformObject zitten dus functies die sterk onderhevig zullen zijn aan veranderingen.
Dit gaat allemaal goed, zelfs met nieuwe IPlatformObject versies die nieuwe methoden of methoden met nieuwe signiture toevoegen aan de interface.
Maar nu, er zullen methode namen aangepast gaan worden of zelfs verwijderd. Nu zou ik graag na het aanroepen van GetRequiredInterfaceVersion() een object aanbieden die aan de hand van een Adapter design pattern het oude gedrag aanbied aan het scherm, dus de vertaalslag van oude interface naar nieuwe interface.
Op deze manier zullen nieuwe platform versies 100% backwards compatible zijn met oude interface versies.
De interface naam wil ik niet veranderen (dus IBasePlatformV1 enzovoorts) is geen optie. Reflection is ook geen optie, zal wel werken maar valt niet onder categorie 'goede code' IMHO.
Hoe kan ik een object aan het scherm aanbieden die de oude interface implementeerd en toch dezelfde interface naam heeft of beter een alternatief design pattern dat dit probleem op een goede manier oplost?