Ik werk aan een project met de volgende acroniemen:
WPF, MVVM, LLBLGen
In dit framework worden of de entities direct tegen een editscherm geplakt, bijvoorbeeld bij stamtabelletjes, of via een View iets meer gescheiden van XAML en entity, maar eigenlijk kan bijvoorbeeld een checkbox nog steeds direct het entityveld manipuleren in vrijwel alle gevallen.
Nu is er één entity die normaliter een proces doorloopt, waarbij steeds meer gegevens verzameld en opgeslagen worden. Stel je bijvoorbeeld voor dat je een registratieproces doorloopt waarbij je in meerdere schermen gegevens moet invullen en dat je tegen het einde een geboortedatum verplicht wil hebben voor die entity terwijl je dat in scherm 1 nog niet wil afdwingen.
Prima.
Nu wil ik tussendoor ergens anders een bepaalde status aanpassen, en vervolgens de entity opslaan. Echter, nu wil mijn entity al gaan checken op velden die ik nog niet gezet heb, want dat doe ik daar nog niet. Om dat te omzeilen heb ik de volgende peop-code geschreven:
Dit doet determine status. Hij kijkt verderop nog naar de waarde van bepaalde velden van de entity om te bepalen welke status hij heeft.
Voordat hij Saved wordt altijd deze functie uitgevoerd:
Ik vind het op zich een goed schema dat je bepaalt wat je moet valideren en dat dan valideert, zo dat je per stap een op maat gesneden groep validaties hebt. Echter, omdat deze code zich in de Entity bevindt, kan ik nu niet meer direct de Entity manipuleren zonder dit soort vieze hacky code te gebruiken, terwijl ik gewend ben meer vanuit een traditioneel three-tier model te denken waarbij een Business laag alle validaties doet en de Entities zeg maar aan je UI knoopt. En dan kan ik dus heel eenvoudig mijn entities blijven manipuleren terwijl aan de andere kant ik ook die geleidelijk aan striktere validatieregels kan toepassen per scherm, gewoon doordat dat andere functies zijn in mijn Business laag.
Wat mijn vraag is, bovenop of dit wel of niet de manier is om het praktisch gezien te doen, wat nou de achterliggende filosofie cq theorie is om in dit soort MVVM applicaties dit soort vraagstukken te tackelen.
WPF, MVVM, LLBLGen
In dit framework worden of de entities direct tegen een editscherm geplakt, bijvoorbeeld bij stamtabelletjes, of via een View iets meer gescheiden van XAML en entity, maar eigenlijk kan bijvoorbeeld een checkbox nog steeds direct het entityveld manipuleren in vrijwel alle gevallen.
Nu is er één entity die normaliter een proces doorloopt, waarbij steeds meer gegevens verzameld en opgeslagen worden. Stel je bijvoorbeeld voor dat je een registratieproces doorloopt waarbij je in meerdere schermen gegevens moet invullen en dat je tegen het einde een geboortedatum verplicht wil hebben voor die entity terwijl je dat in scherm 1 nog niet wil afdwingen.
Prima.
Nu wil ik tussendoor ergens anders een bepaalde status aanpassen, en vervolgens de entity opslaan. Echter, nu wil mijn entity al gaan checken op velden die ik nog niet gezet heb, want dat doe ik daar nog niet. Om dat te omzeilen heb ik de volgende peop-code geschreven:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| /// <summary> /// We want to be able to change the registration type at any moment. /// </summary> public bool ChangeRegistrationTypeOverridingStatus(RegistrationTypeEntity newRegistrationType) { // Set the special flag for status overriding IsStatusOverridden = true; // Dit is een bool veld wat ik zelf heb toegevoegd // Then determine status again to get a non-checking status DetermineStatus(); // Dit doorloopt hij altijd voordat hij Save()d dus ik kan hier ook niet omheen // Otherwise we don't always validate the business rules when saving.... try { RegistrationType = newRegistrationType; return Save(); } catch (Exception ex) { Log.Error(ex); return false; } finally { // Then we put the status back IsStatusOverridden = false; // Then determine status again to get the previous status back DetermineStatus(); } } |
Dit doet determine status. Hij kijkt verderop nog naar de waarde van bepaalde velden van de entity om te bepalen welke status hij heeft.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| private void DetermineStatus() { Status = RegistrationStatus.Created; if (IsStatusOverridden) { Status = RegistrationStatus.Override; return; } // some more checks..... } |
Voordat hij Saved wordt altijd deze functie uitgevoerd:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public override void ValidateFields() { base.ValidateFields(); // When the status is overridden, we only want to validate the base if (Status == TreatmentTrajectStatus.Override) return; // Hier zorg ik er dus voor dat hij eigenlijk helemaal niks meer valideert if (IsRegistration && IsFirstStepDone) { if (BirthDay == null) { SetFieldError(RegistrationFields.BirthDay, "Er moet een geboortedatum ingevoerd zijn"); } } // Some more validation } |
Ik vind het op zich een goed schema dat je bepaalt wat je moet valideren en dat dan valideert, zo dat je per stap een op maat gesneden groep validaties hebt. Echter, omdat deze code zich in de Entity bevindt, kan ik nu niet meer direct de Entity manipuleren zonder dit soort vieze hacky code te gebruiken, terwijl ik gewend ben meer vanuit een traditioneel three-tier model te denken waarbij een Business laag alle validaties doet en de Entities zeg maar aan je UI knoopt. En dan kan ik dus heel eenvoudig mijn entities blijven manipuleren terwijl aan de andere kant ik ook die geleidelijk aan striktere validatieregels kan toepassen per scherm, gewoon doordat dat andere functies zijn in mijn Business laag.
Wat mijn vraag is, bovenop of dit wel of niet de manier is om het praktisch gezien te doen, wat nou de achterliggende filosofie cq theorie is om in dit soort MVVM applicaties dit soort vraagstukken te tackelen.
iOS developer