Costa Brava Cycling Party May 2010

Friday, January 26, 2007

eXpress Persistent Objects (XPO)

Als je wilt beginnen met het gebruiken van DevExpress componenten is het erg handig als je ook gebruik maakt van XPO en hiervan goed de basis begrijpt. Alle componenten van DevExpress maken hier namelijk handig gebruik van. Het is echter niet noodzakelijk om XPO te gebruiken.

Wat is XPO?
XPO is de object-relational mapper van DevExpress. Het is een brug tussen de database en de objecten binnen de applicatie. Zodra je XPO gebruikt hoef je je eigenlijk geen moment zorgen te maken over de achterliggende database, die wordt namelijk automatisch voor je gegenereerd vanuit de door jouw gedefineerde objectenstructuur. Er komt dus geen enkel sql-statement aan te pas! XPO ondersteunt een hele reeks aan databases waaronder sqlserver, oracle en access.

Het gebruik van XPO kent veel voordelen :
• ontwikkelsnelheid is hoger, doordat je geen database laag hoeft te bouwen
• flexibiliteit is hoger, veranderende user requirements worden via de business-objecten automatisch ge-update in de database.
• onderhoud, de applicatie is makkelijk te onderhouden doordat er goed gebruik kan worden gemaakt van object-orientatie.

Hoe werkt XPO?
XPO creeert automatisch een database voor alle objecten die overerven van XPObject. Hierin worden ook alle soorten relaties (1-n,1-1,n-n) meegenomen. In principe krijgt elk object een tabel en een unieke id ook wel Oid genoemd. Aan de hand hiervan kunnen objecten geidentificeerd worden.

Connectie naar database
XPO gebruikt een aantal componenten en lagen om connecties naar de database te managen. Het Session object is hiervan één van de belangrijkste. Dit object beheert alle (persistant) objecten die geinstanteerd worden door de applicatie. Een session gebruikt een DataLayer object, waarin de connectie opgebouwd wordt.

Het Session object is Static, en kan dus overal binnen de applicatie makkelijk aangeroepen worden.

Om te beginnen met het leggen van een connectie naar een database vanuit je visual studio 2005 windows applicatie, hoef je helemaal niks te doen. XPO doet alles automatisch voor je en gaat er standaard vanuit dat de database MsAccess gebruikt wordt, deze wordt automatisch aangemaakt in de applicatie directory. Je kunt dus een nieuw VS2005 project maken, vervolgens leg je referenties naar XPO en je maakt een business object aan welke je vervolgens opslaat (zie 2.2.2.). Op dat moment wordt de database automatisch aangemaakt.

Indien je enige controle wilt hebben over waar de database aangemaakt wordt kun je gebruik maken van de XPOdefault class. Deze class heeft een Datalayer object waarvoor een connectionstring ingesteld kan worden :

AccessDatabaseFileName = "c:\\temp\\student.mdb";
string connString = DevExpress.Xpo.DB.AccessConnectionProvider.GetConnectionString(_AccessDatabaseFileName);
XpoDefault.DataLayer = XpoDefault.GetDataLayer(connString, AutoCreateOption.DatabaseAndSchema);


XPObject
Elke .NET applicatie werkt tegenwoordig met business objecten. Om deze business objecten met XPO te integreren kun je ze eenvoudig laten overerven van XPObject :

public class Student : XPObject {
public Student() {
}


Je krijgt automatisch een save functie erbij, zodat het object kunt opslaan :

Student stud = new Student();
stud.Name = "George Baker";
stud.Leeftijd = 52;
stud.Save();


XPCollection
Om objecten uit de database te halen heeft DevExpress een XPCollection class ontworpen. Records zijn eenvoudig op te halen door hier een instantie van te creeeren en in te stellen van welk type deze collection is :

XPCollection students = new XPCollection(typeof(Student));

De XPCollection class kan vervolgens als datasource dienen voor andere DevExpress componenten als bijvoorbeeld de XtraGrid.

Binnen een XPCollection class kan zowel client-side als server-side gefilterd worden. Voor client-side filtering wordt de “filter” property gebruikt, en voor server-side de “criteria” property.

Het filteren gaat met behulp van een “CriteriaOperator” object. Hierin wordt de filter opgeslagen :

CriteriaOperator criteria = CriteriaOperator.Parse("Name != 'George Baker'");

Vervolgens kan dit criteria object worden toegekend aan de “filter” of “criteria” property van de xpcollection :

students.filter = criteria

De studenten collectie bevat nu alleen nog maar studenten die geen George Baker heten.

Relaties
Relaties leggen naar andere business objecten kan eenvoudig door gebruik te maken van het association attribuut. Hieronder staat een voorbeeld waarbij één student meerdere vakken kan volgen :

public class Student : XPObject {
[Association("Student-Vak", typeof(Vak)), Aggregated]
public XPCollection Vakken { get { return GetCollection("Vak");
}


De bijbehorende class “Vak” ziet er dan als volgt uit :

public class Vak : XPObject {
[Association("Student-Vak")]
public Student student;
}


Uiteraard zijn ook many to many relaties mogelijk, of 1 op 1 relaties. Aggregated geeft aan dat als een student verwijderd wordt, alle vakken ook automatisch worden mee verwijderd.

Objecten zoeken
Eén single object kan altijd worden opgehaald met een aantal standaard XPO functies. Bijvoorbeeld “GetObjectbyKey” :

Student student = (Student)Session.DefaultSession.GetObjectByKey(typeof(Student), storedOid);

of met “FindObject” :

Student student = (Student)Session.DefaultSession.FindObject(typeof(Student), "name = 'George Baker'");

No comments: