Ik kan niet wachten...

Published Wed, Feb 25 2004 9:12 AM

...op whidbey en in dit geval c# 2.0

met het validatie framework van e-platform loop ik tegen het feit aan dat valuetypes niet geboxed kunnen worden naar null.
hierdoor kan ik niet zien of een valuetype is geinitialiseerd.

Om dit verhaal wat duidelijker te maken nu mijn praktijk probleem waar ik tegenaan loop:
ik wil met het validatieframework een veld uit de database valideren dat optioneel is en een valuetype is.
bijvoorbeeld een byte (System.Int16) voor het veld leeftijd. Maar als er een leeftijd is ingevuld, dan moet deze minimaal 16 jaar zijn.

Wanneer een gebruiker op een scherm geen leeftijd invult is dit correct want het veld is optioneel.
In de business laag gaat het validatieframework alle velden van het scherm valideren en komt bij Leeftijd.

Leeftijd is niet null dus wordt het gevalideerd. Default heeft een System.Int16 een waarde van 0.
Maar de validatieregels zeggen dat de minimale leeftijd 16 moet zijn. Er treedt een validatie error op. En terecht.

Het validatieframework kan dus niet omgaan met optionele velden die valuetype zijn en die een waarde moeten hebben van > 0.
Helaas kan ik hier niets aan doen. De enige oplossing die ik kon bedenken is een flag bijhouden wanneer een veld veranderd is. (dirty flag)
alleen wanneer het veld dirty is, deze valideren.

Het alternatief staat mij beter aan: wachten op c# 2.0. Hier zijn er alleen nog maar ReferenceTypes.
Waardoor de Primitive Types in .NET 1.1 wel null of NaN kunnen zijn zijn.

 

Comments

# Pascal Naber said on Wednesday, February 25, 2004 9:15 AM

Het antwoord op AL je problemen! Ook voor al je verslavingen!

http://sourceforge.net/projects/nullabletypes/

# Pascal Naber said on Wednesday, February 25, 2004 9:22 AM

Thanx voor de link.

Het probleem hiermee is dat we in een SOA zitten te werken.

Dus externe partijen die gebruik willen maken van de services moeten ook van deze typen op de hoogte zijn. Het is wel mogelijk deze beschikbaar te stellen maar niet echt gebruiksvriendelijk. Maar zeker een oplossing.

# Pascal Naber said on Wednesday, February 25, 2004 9:48 AM

Lijkt er eerder op dat de UI de verkeerde data aan de business laag door geeft ;-)
Ik weet niet of Dirty wel zo'n handige is want dat betekent mi dat je statefull bent.
Wellicht is het aanbieden van EmptyValue... beter. (Dus EmptyValueLeeftijd ). De UI is dan verantwoordelijk voor het vullen van de business entiteit en vult of de ingevulde waarde of de EmptyValue...
Maar wellicht overzie ik hey probleem domein niet helemaal...

# Pascal Naber said on Wednesday, February 25, 2004 10:54 AM

Helemaal eens dat Dirty geen handige is. (Ook niet van plan om te implementeren.)

We hebben een 'constraint object' dat een class is waarin voor ieder veld in de DB een property staat. Boven iedere property staan attributen mbt de juiste validationrules. (GreaterThan, LessThan etc.)

Zodra een gebruiker op save klikt vult de businesslaag het constraint object. En roept het validatieframework aan met het gevulde constraintobject. Als data niet aan de validationrules voldoet volgt er bijvoorbeeld een exception.

Het vullen van het constraintObject gaat generiek. Dus als Leeftijd niet is ingevuld zal deze overgeslagen worden. Hierdoor blijft de defaultvalue van een valuetype 0 over in het constraintobject.

Nu gaat het validatieframework het constraintobject valideren. Omdat leeftijd geen null is wordt deze gewoon gevalideerd.

Nu had ik met die dirty in gedachte, dat wanneer Leeftijd wordt geset de private bool LeeftijdDirty op true wordt gezet. Alleen wanneer de flag true is mag het validatieframework het veld valideren.
Omdat Leeftijd nooit geset wordt, blijft de flag false en gaat het validatieframework deze ook niet valideren. Maar daarvoor moet ik teveel veranderen aan het validatieframework. Dit is volgens mij stateless omdat in 1 handeling de properties worden gezet op het constraintObject en daarna wordt deze gebruikt om te valideren. Hierna wordt deze weggegooid.

Rene, is EmptyValueLeeftijd dan van hetzelfde datatype als Leeftijd ?
Wil je het misschien verder uitleggen want ik begrijp niet hoe je het precies bedoeld.

# Pascal Naber said on Wednesday, February 25, 2004 2:58 PM

Vraagje hoor,

Maar ik besluit een datum in te vullen.....
en halverwege hert form bedenk ik mij weer....
en maak m weer leeg.......

Wat is de dirty flag dan............

# Pascal Naber said on Wednesday, February 25, 2004 3:06 PM

Patrick,

Ik heb het hier over een web applicatie.
Heel het verhaal hierboven speelt zich client-side af. Dus de dirty flag veranderd pas wanneer de gebruiker een form post.


# Pascal Naber said on Wednesday, February 25, 2004 3:21 PM

Ik zal het allemaal wel niet snappen.
maar is de validatie dan niet gewoon....

indien waarde <> 0 dan > 16

# Pascal Naber said on Wednesday, February 25, 2004 3:34 PM

Dat komt, omdat we schema's delen en niet een klas! Toch Pascal?! :)

# Pascal Naber said on Wednesday, February 25, 2004 4:15 PM


ja ja .....

dan moet je een herkenning van je schema inbouwen.

Zodat je aan de hand van het schema weet wat voor een object het is....

Zit standaard in BizTalk.


Leave a Comment

(required) 
(required) 
(optional)
(required) 
Please add 3 and 5 and type the answer here: