Ik blijf mij altijd een beetje achter de oren krabben mbt. het opzetten van dit soort dingen, dus ik vraag het maar gewoon.
Ik ga zeer binnenkort aan mijn eerste echt grote project beginnen, looptijd van ongeveer 9 maanden. Veel van deze tijd zal gebruikt worden voor het systematisch afwerken van testscripts, omdat het een applicatie is die binnen de verzekeringssector gebruikt zal gaan worden door ondernemers (het online maken van het naverrekeningstraject, dit is het aanpassen van bepaalde waarden zodat de premiehoogte bijgesteld kan worden).
Officieel start het traject pas in januari, maar aangezien ik er liever een poosje langer over nadenk ben ik mezelf bezig gaan houden met het uitdokteren van een goede architectuur.
Het gaat overigens om een C# project, ondersteunt met een MS SQL Server 2005 database.
Goed, stukje brainfart.
1) maak ik voor elke tabel in de database een entiteitsbestand aan, zodat ik mijn relationele model redelijk kan vertalen naar een Object:
2) Ik maak een general database access klasse. Deze klasse weet in feite niets van de applicatie, hij leest de connectionstring uit een configuratiebestand (web.config oid), verbindt met de database. Hij verwacht een parameter, namelijk de naam van een stored procedure of, afhankelijk van het type query, een dynamic generated query. Een geeft een DataSet, DataReader of DataTable terug (nog niet helemaal over uit), wat gelijk staat aan een java ResultSet. Deze klasse wil ik als static singleton implementeren, zodat er niet onnodig verbindingen naar de database openstaan (ook al heb je een GC) en het op klasseniveau te benaderen is.
3) Deze Objecten die 2 teruggeeft dienen natuurlijk omgezet te worden naar de juiste objecten, deze klassen zorgen ervoor dat dit gebeurt. Een DataSet met 2 klant objecten geeft een datastructuur terug met 2 Klant objecten. In het geval van Foobar gaat deze klasse FoobarDataAccess heten. En implementeerd verschillende eisen mbt het ophalen van data bv:
Mijn vraag, ga ik zo juist met de abstracties om, liggen de verantwoordelijkheden op deze manier goed?
Is dit uberhaupt handig, ik kan me voorstellen dat ik in m'n business layer een enorme chaos aan rondslingerende objecten ga creeren
Stel dat FooBar een 1-n relatie heeft met FussBarr, hoe ga ik dan op de juiste manier met de joins om? Welke klasse heeft die verantwoordelijkheid? Sla ik gewoon een FooBar object op en zoek ik er later een FussBarr collectie bij op?
Ik weet dat ik een ORMapper of XSD oid dan gebruiken, maar wil eerst de kneepjes leren kennen voor ik truukjes ga toepassen
Ik ga zeer binnenkort aan mijn eerste echt grote project beginnen, looptijd van ongeveer 9 maanden. Veel van deze tijd zal gebruikt worden voor het systematisch afwerken van testscripts, omdat het een applicatie is die binnen de verzekeringssector gebruikt zal gaan worden door ondernemers (het online maken van het naverrekeningstraject, dit is het aanpassen van bepaalde waarden zodat de premiehoogte bijgesteld kan worden).
Officieel start het traject pas in januari, maar aangezien ik er liever een poosje langer over nadenk ben ik mezelf bezig gaan houden met het uitdokteren van een goede architectuur.
Het gaat overigens om een C# project, ondersteunt met een MS SQL Server 2005 database.
Goed, stukje brainfart.
1) maak ik voor elke tabel in de database een entiteitsbestand aan, zodat ik mijn relationele model redelijk kan vertalen naar een Object:
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
| // stel je even de klasse Foobar voor // met 2 members: foo en bar public class Foobar { private int id = -1; private string foo = String.Empty; private string bar = String.Empty; Id { get { return value; } } Foo { set { foo = value; } get { return foo; } } Bar { set { bar = value; } get { return bar; } } } |
2) Ik maak een general database access klasse. Deze klasse weet in feite niets van de applicatie, hij leest de connectionstring uit een configuratiebestand (web.config oid), verbindt met de database. Hij verwacht een parameter, namelijk de naam van een stored procedure of, afhankelijk van het type query, een dynamic generated query. Een geeft een DataSet, DataReader of DataTable terug (nog niet helemaal over uit), wat gelijk staat aan een java ResultSet. Deze klasse wil ik als static singleton implementeren, zodat er niet onnodig verbindingen naar de database openstaan (ook al heb je een GC) en het op klasseniveau te benaderen is.
3) Deze Objecten die 2 teruggeeft dienen natuurlijk omgezet te worden naar de juiste objecten, deze klassen zorgen ervoor dat dit gebeurt. Een DataSet met 2 klant objecten geeft een datastructuur terug met 2 Klant objecten. In het geval van Foobar gaat deze klasse FoobarDataAccess heten. En implementeerd verschillende eisen mbt het ophalen van data bv:
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
| // pseudo/lossevinger werk // punt is om een loosely type datarow in een object te laten veranderen public class FoobarDataAccess { public HashTable<FooBar> FetchAllFoobar() { HashTable<FooBar> retTable = new HashTable<FooBar>(); DataTable dt = GeneralDB.GetRecords("naam van stored procedure"); foreach(DataRow dr in dt.Rows) { FooBar fb = new FooBar(); fb.Id = dr["id"]; fb.Foo = dr["foo"]; fb.Bar = dr["bar"]; retTable.add(fb); } return retTable; } public FooBar GetFooBarById(int id) { FooBar fb = new FooBar(); DataRow dr = GeneralDB.GetRecord("naam van stored procedure", id); // weer een mapping naa het object } |
Mijn vraag, ga ik zo juist met de abstracties om, liggen de verantwoordelijkheden op deze manier goed?
Is dit uberhaupt handig, ik kan me voorstellen dat ik in m'n business layer een enorme chaos aan rondslingerende objecten ga creeren
Stel dat FooBar een 1-n relatie heeft met FussBarr, hoe ga ik dan op de juiste manier met de joins om? Welke klasse heeft die verantwoordelijkheid? Sla ik gewoon een FooBar object op en zoek ik er later een FussBarr collectie bij op?
Ik weet dat ik een ORMapper of XSD oid dan gebruiken, maar wil eerst de kneepjes leren kennen voor ik truukjes ga toepassen