Ik ben bezig met een vrij grote desktop applicatie. Met desktop applicatie bedoel ik een client applicatie met user interface.
Nu werkt alles, maar ik heb het gevoel dat de achterliggende architectuur niet perfect is. Ik heb al meerdere keren refactoriteraties gedaan maar ik kom niet tot een architectuur waar ik echt tevreden mee ben. Ik weet dat er geen architectuur is die voor alle desktop applicaties geldt, dus ik zal kort uitwijden over de inhoud van de applicatie die hier relevant is.
Vraag 1: Ik denk dat het derde punt (de data voor de UI) in het model van MVC hoort. Dat was ook het idee. Echter, met puur MVC is het m.i. zo dat alle acties door controllers uitgevoerd worden. Als ik dus in mijn model een class Connection heb die weergegeven wordt door de UI, is het tegen de principes in als ik hier een functie Disconnect() maak, want dat hoort dan in een controller. Heb ik dit juist?
Vraag 2: Ik heb nu een Facade in het UI gedeelte om te reageren op acties van gebruikers. Deze kan bijvoorbeeld forms maken en controllers aanroepen. Ter illustratie: het weergeven van het instellingen venster of het inloggen op de server zijn methods in de Facade. Dit werkt prima, maar is dit logisch?
Vraag 3: Ik heb nu drie controllers: een controller voor de achterliggende processen, een controller voor data en een voor plug-ins. Die achtergrondprocessen kunnen de data beïnvloeden. Als er een verbinding verbreekt of data wijzigt, dan wordt dit door de data controller verwerkt. Deze data controller bevat in feite meerdere collecties van classes zoals ze in de UI weergegeven worden. Dus: als een achtergrondproces een wijziging heeft wordt dit aan de data controller doorgegeven. Deze update het model. Probleem is hierbij dat dit in een andere thread gebeurt dan de main thread, waardoor de user interface indirect geupdate wordt uit een andere thread. Hoe los ik dit op? Moet de data controller synchroniseren met de main thread? Dit is m.i. ook tegen MVC principes in omdat er dan een sterke koppeling komt tussen V en C.
Vraag 4: Als men op een knop drukt in de UI, dan wordt er een method aangeroepen in de facade. So far so good. Maar hoe reageert een UI nou op events? Moet een facade of controllers events bevatten?
Zoals gezegd werkt het nu prima, dus de vraag is niet hoe ik iets werkend moet krijgen. Het gaat me puur om een goede architectuur waar ik verder op kan ontwikkelen en het goed over kan dragen.
Alvast bedankt!
Nu werkt alles, maar ik heb het gevoel dat de achterliggende architectuur niet perfect is. Ik heb al meerdere keren refactoriteraties gedaan maar ik kom niet tot een architectuur waar ik echt tevreden mee ben. Ik weet dat er geen architectuur is die voor alle desktop applicaties geldt, dus ik zal kort uitwijden over de inhoud van de applicatie die hier relevant is.
- Er lopen verschillende autonome processen in de applicatie op de achtergrond. Dit heb ik goed voor elkaar; het is geïsoleerd in een aparte assembly en de communicatie loopt prima met events;
- Er is veel communicatie met servers, zowel stateful als stateless. Het stateless gedeelte werkt met webservices, en daar horen dus data transfer objects bij. Data access objects blijven op de server;
- Data die uit de server binnenkomt of die anderszins gemaakt wordt (plug-ins, verbindingen, instellingen, etc) hebben een eigen class die properties en relaties heeft voor weergave in de UI (dit zijn dus geen DTOs).
Vraag 1: Ik denk dat het derde punt (de data voor de UI) in het model van MVC hoort. Dat was ook het idee. Echter, met puur MVC is het m.i. zo dat alle acties door controllers uitgevoerd worden. Als ik dus in mijn model een class Connection heb die weergegeven wordt door de UI, is het tegen de principes in als ik hier een functie Disconnect() maak, want dat hoort dan in een controller. Heb ik dit juist?
Vraag 2: Ik heb nu een Facade in het UI gedeelte om te reageren op acties van gebruikers. Deze kan bijvoorbeeld forms maken en controllers aanroepen. Ter illustratie: het weergeven van het instellingen venster of het inloggen op de server zijn methods in de Facade. Dit werkt prima, maar is dit logisch?
Vraag 3: Ik heb nu drie controllers: een controller voor de achterliggende processen, een controller voor data en een voor plug-ins. Die achtergrondprocessen kunnen de data beïnvloeden. Als er een verbinding verbreekt of data wijzigt, dan wordt dit door de data controller verwerkt. Deze data controller bevat in feite meerdere collecties van classes zoals ze in de UI weergegeven worden. Dus: als een achtergrondproces een wijziging heeft wordt dit aan de data controller doorgegeven. Deze update het model. Probleem is hierbij dat dit in een andere thread gebeurt dan de main thread, waardoor de user interface indirect geupdate wordt uit een andere thread. Hoe los ik dit op? Moet de data controller synchroniseren met de main thread? Dit is m.i. ook tegen MVC principes in omdat er dan een sterke koppeling komt tussen V en C.
Vraag 4: Als men op een knop drukt in de UI, dan wordt er een method aangeroepen in de facade. So far so good. Maar hoe reageert een UI nou op events? Moet een facade of controllers events bevatten?
Zoals gezegd werkt het nu prima, dus de vraag is niet hoe ik iets werkend moet krijgen. Het gaat me puur om een goede architectuur waar ik verder op kan ontwikkelen en het goed over kan dragen.
Alvast bedankt!