3-layer architecture og bruger input validering
HejJeg er ved at lave en ajax baseret web løsning og har givet mig i kast med en 3-lags arkitektur (alle i samme klasse), men mangler nogen tanker omkring min opsætning, så jeg håber i vil gi lidt input. Mit hovedproblem er at jeg ikke 100% kan finde ud af hvordan jeg bør gøre med min validering. Lige nu har jeg alt valideringen liggende i mit BA layer som kaster en exception hvis der er noget galt. Jeg har lavet min egen UserFriendlyException forbeholdt til fejl i inputs, som kan serialiseres så den kan bruges i javascript. Koden skal hovedsageligt bruges som async web app, men en lille chance for at den skal implementeres med winforms:
--- ClassLib ---
class Person
{
//Business object
public string name...
public int age...
...
public void Save()
{
PersonBAL.Save(this)
}
}
class PersonBAL
{
//Validation o.s.v
public static void Save(Person person)
{
//Forskellig validering inden den sendes til database
List<Errors> errors = new List...()
if(person.Name == "")
errors.Add(new Error("Person.Name", "RequiredField", "Feltet skal udfyldes"));
if(person.Age<0) // (lidt tænkt måske)
errors.Add(new Error("Person.Age","InvalidValue", "Alderen skal være større end 0"));
if(errors.count>0)
throw new UserFriendLyException(errors); //denne fanges af onFail herunder og indeholder nu fejlbeskederne
PersonDAL.Save(person); //indsætter i databasen
}
}
På denne måde kan jeg via javascript/ajax kalde min webservice
--- Præsentationslag ---
AddPerson.aspx:
function add()
{
var name = ...
var age = ...
PersonWebservice.AddPerson(name, age,..., onSuccess, onFail)
}
function onSuccess(...){ ... }
function onFail(error, method, context)
{
if(error.get_exceptiontype() == 'UserFriendlyException')
{
var errors = JSON.parse(error.Errors);
//brug dataen fra classlib Error Klassen til at markere
//felter der indeholder fejl og vise fejlbeskeden
}
else
{
//Exceptionen kom fra en alvorlig fejl og skal behandles anderledes
}
}
Hvad jeg ikke kan li ved denne metode er egentligt den ene ting at jeg altid har lært at exceptions IKKE skal bruges til at styre kode hvis andet er muligt. Jeg kunne lige så godt have indført alm. check og retuneret error objekterne gennem webservicen
Hvad jeg godt kan li ved denne metode:
- Koden er nem at læse
- Alt validering er samlet ét sted hvor det ikke kan omgåes
- Da error-teksten sættes i Error objektet har jeg mulighed for at bruge sprogversionering o.s.v gennem .net (i det her tilfælde)
- Javascript'en fanger det som en fejl (onFail) i stedet for at jeg i min onSuccess skal checke om hvorvidt der var fejl i input
- Min webservice kan retunere de oplagte objekter i stedet for at retunere en samling errors, som hvis == null betyder alt gik godt.
Jeg har læst om forskellige metoder hvor jeg fx kunne have en Validate på Personklassen, hvilket også ville fungere fint i en winform, men da jeg kører asynkron vil jeg enten skulle kalde serveren to gange (én valider, én insert) eller jeg ville ende med at skulle returnere fejlobjekter om hvorvidt der var fejl.
Mit bedste bud på forbedring er at lave javascript validering inden jeg poster, og derfor ikke får en UserFriendlyException, men at den stadig eksisterer for at sikre reglerne bliver håndhævet. Det giver dog en lille udfordring med sprogversioneringen (fejlbeskederne) samt at jeg nu vil have 2x valideringskode at vedligeholde :(
Hvad er jeres tanker omkring denne opsætning? Er det dårlig praksis at kaste exceptions over sådanne basale regler i en opsætning som denne? Og hvad kunne alternativet være?