- Posted by Jakob Andersen on March 21, 2008
This post is in danish and is a third part in an introduction to Castle ActiveRecord, if you would like to see this content in english let me know Introduktion
Vi så i første indlæg hvordan vi oprettede ActiveRecord klasser. Disse klasser kunne bruges til at gemme objekter i databasen ved hjælp af metoder vi fik foræret ved at nedarve fra ActiveRecordBase<T>. I andet indlæg så vi hvordan vi kan forespørge på data.
I dette indlæg vil vi kigge på nogle lidt mere avancerede funktionaliteter ActiveRecord stiller til rådighed. Det er ikke en nødvendighed at læse dette for at komme igang med ActiveRecord men det giver en række nyttige værktøjer.
Validering af egenskaber
I C# har vi mulighed for at specificere datatyper, og vi får returneret fejl hvis input ikke passer ind i den specificerede datatype, men f.eks. emails og telefonnumre skal vi validere selv for at sikre de lever op til konventioner. ActiveRecord kan hjælpe os med den slags valideringer, men først skal vi tilføje en reference til den assembly der indeholder disse valideringsmetoder, nemlig Castle.Components.Validator.dll.
Når vi har refereret til den har vi en lang række validator attributter til rådighed i Castle.Components.Validator namespacet, disse kan vi nu dekorere vores egenskaber med. En af de simple validatorer hedder ValidateNonEmpty og sikrer at et felt er udfyldt, denne kan vi sætte på vores Blogger klasses Name property:
[Property, ValidateNonEmpty]
public string Name{get;set;}
Funktionalitet til at udnytte validering
For at kunne gøre brug af disse valideringer skal vores ActiveRecord implementere nogle metoder som ikke er i ActiveRecordBase<T>, men heldigvis findes der en klasse i ActiveRecord der hedder ActiveRecordValidationBase<T>. I denne klasse er der metoden IsValid og egenskaben ValidationErrorMessages. Så dem får vi på alle vores ActiveRecord's hvis vi nedarver fra denne. Det giver os nu mulighed for at skrive kode som nedenstående:
Blogger blogger = new Blogger();
blogger.Name = "";
if(blogger.IsValid())
{
blogger.Save();
}else
{
Console.WriteLine("Der var fejl i valideringen:");
foreach (string errorMessage in blogger.ValidationErrorMessages)
{
Console.WriteLine(errorMessage);
}
}
ovenstående vil give os en fejl der siger at feltet Name er krævet og skal udfyldes.
Validatorer
Der er selvfølgelig flere validatorer end ValidateNonEmpty. Der findes validatorer til kreditkort, email, datoer, intervaller, længder på strenge og en masse andre. Så vi kan få valideret data i vores objekter før vi gemmer dem. Hvis vi ikke er tilfredse med validatorerne kan vi specificere et regulært udtryk til en RegExValidator eller vi kan lave vores egen validator ved at implementere IValidator interfacet.
Undgå nedarvning fra en baseklasse
Hvis man af en eller anden grund ikke ønsker at nedarve fra en baseklasse kan man sagtens bruge ActiveRecord alligevel, alle de operationer vi har set på vores ActiveRecord klasser kan tilgåes på en anden måde:
ActiveRecordMediator<Bloogger>.FindAll(...);
Mere funktionalitet
Udover at der på mediator klassen er de metoder vi allerede har set, er der rent faktisk en enkelt metode der kan være en fordel at kende. Det kunne f.eks. være jeg ønskede at tælle hvor mange Post instanser der lever op til et bestemt kriterie:
int ActiveRecordPostsCount = ActiveRecordMediator<Post>.Count(Expression.Like("Title", "ActiveRecord", MatchMode.Anywhere));
Ganske som de tidligere metoder vi har set på har Count overloads der kan tage DetachedCriteria.
Mere ActiveRecord?
ActiveRecord kan en del mere end jeg har gennemgået i mine indlæg, bl.a. kan nævnes mapping af nedarvningshirakier, aggregeringsforespørgsler med HQL, hent enkelte egenskaber med HQL samt komponenter. Derudover er der et hav af muligheder for selv at ændre hvordan ting fungerer i ActiveRecord f.eks. ved at have sin egen base klasse der nedarver fra ActiveRecordBase<T> og tilgår dens protectede egenskaber.
Afrunding
ActiveRecord er simpelt at bruge og let at komme igang med. Samtidig med at det er simpelt giver det os mulighed for at gribe ind og bestemme hvordan ActiveRecord skal gøre stort set alle ting undervejs. Så min anbefaling vil være at komme igang, prøv at leg med det. Skriv en kommentar hvis du har problemer eller spørgsmål eller læs evt dokumentationen på Castle's hjemmeside.
Næste gang
Næste gang handler det ikke om ActiveRecord mere, men derimod om et andet projekt der også hører under Castle. Som på samme måde som ActiveRecord kan gøre din dataadgang let kan hjælpe dig med at gøre en anden del af din hverdag let, og så spiller det endda rigtig godt sammen med ActiveRecord. Så hæng på, vi er slet ikke færdige med Castle endnu!