Ik ben momenteel bezig met het ontwikkelen van een nieuwe generatie van een uitgebreid CMS. Op dit moment beheert een enkele instantie van dit CMS meer dan 100 websites. Deze hebben allen een totaal andere frontend en andere data. Het CMS is qua ontwerp op dit moment ook object georienteerd omdat informatie over diensten (bijvoorbeeld) via een object 'Dienst' wordt toegevoegd, en Nieuws via een object 'Nieuws'. Alle sites putten uit een totale repository van meer dan 70 objecten.
In de huidige situatie is de implementatie weliswaar via .NET en met een assembly voor de code, maar deze code is niet OO zoals het zou moeten. Het nieuwe systeem moet wel netjes OO zijn, waarbij classes de diverse ontwerpobjecten (zoals nieuws, diensten, e.d.) representeren.
De gewenste situatie
De gewenste situatie is dat de object structuur van het CMS zeer flexibel is. Ik wil niet nu al hoeven vast te stellen welke objecten er allemaal zullen gaan zijn en welke velden deze hebben. Mijn wens is om een soort baseobject te definieren die door andere objecten wordt georven. Dit basisobject bevat alle standaardvelden (ID, datum van creatie, wijzigingsdatum, enz) en de onderliggende objecten breiden dit uit met extra velden. Bij een Productobject wordt daar bijvoorbeeld Prijs, Kleur en Vorm aan toegevoegd.
Ik wil niet dat - elke keer als een klant een extra veld wil of er een nieuw object nodig is - de code moet worden aangepast. Bij voorkeur zijn de objecten, en de informatie die per object gedefinieerd kan worden, via het CMS te beheren. Zo kan (in potentie) elk denkbaar object aangemaakt worden, zolang het niet hele vreemde eigenschappen heeft (dat soort objecten hebben we ook, zoals een webshop, maar dat valt even buiten deze discussie).
Het probleem
Ik weet niet goed hoe ik het bovenstaande kan implementeren. Het is voor mij geen probleem om het ontwerp helemaal uit te werken in VB.NET met een assembly met classes. Probleem is dat de structuur dan dus vast staat, en niet gewijzigd kan worden (voor zover ik weet) zonder in de code van de assembly te wroeten. Dat is een probleem op implementatiegebied. Hoe kan ik flexibele objecten maken die - bij wijze van spreke - tijdens runtime kunnen worden gemaakt (de structuur)?
Het tweede probleem is hoe ik dergelijk flexibele data moet persisteren in een database. Ik weet niet van tevoren welke velden en welke objecten er zijn, dus de structuur is grotendeels onbekend. Op zich is dit heel dirty op te lossen met een tabel voor Objecten, eentje voor Velden en eentje voor Waarden, maar een dergelijke abstractie in de database vind ik erg lelijk. Om over performance maar niet te praten. Een betere oplossing lijkt te liggen in XML, bijvoorbeeld door tabellen te maken waar in een laatste kolom XML kan worden geplaatst om een X aantal andere kolommen te definieren. Ik maak gebruik van SQL Server 2005, dus dat kan met XQuery. Een laatste oplossing is dat ik een losse database maak voor objectinformatie (Objecten, Velden, Relaties) en vervolgens via een DBAL alle tabellen dynamisch aan laat maken en laat wijzigen wanneer de objectinformatie wijzigt. Alle objecten die nieuw worden toegevoegd worden dan automatisch als tabel opgesteld.
Hebben jullie suggesties of inzichten in dit ontwerpvraagstuk? Het is echt noodzakelijk om het CMS zo flexibel te maken, aangezien we momenteel veel tijd kwijt zijn met het toevoegen van een veldje hier of een veldje daar aan een object. Dat kost tijd en dus geld. Een goede en flexibele oplossing is ook beter voorbereid op de toekomst.
Een belangrijke voetnoot
Het gaat nadrukkelijk om relatief eenvoudige contentobjecten, zoals nieuws, diensten, producten, auto's, producten, enzovoorts. Ze bestaan vrijwel altijd uit een enkele tabel met een X-aantal velden in de huidige implementatie.
In de huidige situatie is de implementatie weliswaar via .NET en met een assembly voor de code, maar deze code is niet OO zoals het zou moeten. Het nieuwe systeem moet wel netjes OO zijn, waarbij classes de diverse ontwerpobjecten (zoals nieuws, diensten, e.d.) representeren.
De gewenste situatie
De gewenste situatie is dat de object structuur van het CMS zeer flexibel is. Ik wil niet nu al hoeven vast te stellen welke objecten er allemaal zullen gaan zijn en welke velden deze hebben. Mijn wens is om een soort baseobject te definieren die door andere objecten wordt georven. Dit basisobject bevat alle standaardvelden (ID, datum van creatie, wijzigingsdatum, enz) en de onderliggende objecten breiden dit uit met extra velden. Bij een Productobject wordt daar bijvoorbeeld Prijs, Kleur en Vorm aan toegevoegd.
Ik wil niet dat - elke keer als een klant een extra veld wil of er een nieuw object nodig is - de code moet worden aangepast. Bij voorkeur zijn de objecten, en de informatie die per object gedefinieerd kan worden, via het CMS te beheren. Zo kan (in potentie) elk denkbaar object aangemaakt worden, zolang het niet hele vreemde eigenschappen heeft (dat soort objecten hebben we ook, zoals een webshop, maar dat valt even buiten deze discussie).
Het probleem
Ik weet niet goed hoe ik het bovenstaande kan implementeren. Het is voor mij geen probleem om het ontwerp helemaal uit te werken in VB.NET met een assembly met classes. Probleem is dat de structuur dan dus vast staat, en niet gewijzigd kan worden (voor zover ik weet) zonder in de code van de assembly te wroeten. Dat is een probleem op implementatiegebied. Hoe kan ik flexibele objecten maken die - bij wijze van spreke - tijdens runtime kunnen worden gemaakt (de structuur)?
Het tweede probleem is hoe ik dergelijk flexibele data moet persisteren in een database. Ik weet niet van tevoren welke velden en welke objecten er zijn, dus de structuur is grotendeels onbekend. Op zich is dit heel dirty op te lossen met een tabel voor Objecten, eentje voor Velden en eentje voor Waarden, maar een dergelijke abstractie in de database vind ik erg lelijk. Om over performance maar niet te praten. Een betere oplossing lijkt te liggen in XML, bijvoorbeeld door tabellen te maken waar in een laatste kolom XML kan worden geplaatst om een X aantal andere kolommen te definieren. Ik maak gebruik van SQL Server 2005, dus dat kan met XQuery. Een laatste oplossing is dat ik een losse database maak voor objectinformatie (Objecten, Velden, Relaties) en vervolgens via een DBAL alle tabellen dynamisch aan laat maken en laat wijzigen wanneer de objectinformatie wijzigt. Alle objecten die nieuw worden toegevoegd worden dan automatisch als tabel opgesteld.
Hebben jullie suggesties of inzichten in dit ontwerpvraagstuk? Het is echt noodzakelijk om het CMS zo flexibel te maken, aangezien we momenteel veel tijd kwijt zijn met het toevoegen van een veldje hier of een veldje daar aan een object. Dat kost tijd en dus geld. Een goede en flexibele oplossing is ook beter voorbereid op de toekomst.
Een belangrijke voetnoot
Het gaat nadrukkelijk om relatief eenvoudige contentobjecten, zoals nieuws, diensten, producten, auto's, producten, enzovoorts. Ze bestaan vrijwel altijd uit een enkele tabel met een X-aantal velden in de huidige implementatie.