Ik heb Fowlers (ja, ik weet dat z'n naam gevoelig is
) boek Patterns of Enterprise Application Architecture gekocht en ben begonnen met het implementeren van wat patterns uit dat boek (niet voor een project, maar voor mezelf). Het zit nu al een beetje in elkaar en ik heb nu een datamapper, met identity map, unit of work en lazy loading. Alhoewel ik snap waarom het afgeraden wordt zelf een mapper te schrijven (af en toe is het heel erg complex) begint het al echt ergens op te lijken. Creeren, verwijderen en veranderen van objecten kan nu allemaal in de BLL zonder dat je ook maar iets ziet van de mapper laag.
Een van de problemen die nu nog openstaan is het goed laten samen werken van de unit of work en lazy loading, deze zitten namelijk nog al 's in elkaars weg. Een voorbeeldje, ik heb de volgende business class waar zowel ondersteuning voor unit of work en lazy loading in zit:
De functie Load(), vult de instantie van het object simpelweg door iets uit de database te trekken en dan het veld up te daten middels de setter. Het probleem is dat hiermee ook het object als dirty wordt gemarkeerd, immers wordt de setter van het veld aangeroepen. Dit is te voorkomen door de status van het object te bekijken, is deze nog niet geladen dan kan het object niet als dirty worden gemarkeerd. Dit werkt opzich goed, alleen het gaat mis als je iets aan het object wilt veranderen als hij nog niet geladen is, het object wordt dan niet als dirty gemarkeerd en zal niet worden geupdate.
Het probleem: eigenlijk zou ik het liefst het object van 'achteren' (niet zichtbaar voor de BLL) willen vullen, hierbij komt de unit of work niet van te pas. Pas als het object van 'voren' wordt veranderd (tijdens gebruik in de BLL) komt de unit of work er aan te pas. Ik kan nu 2 oplossingen bedenken:
1) er wordt gecontroleerd wie de setter aanroept, is dit de BLL dan wordt het object dirty, is dit de loader (voor lazy loading) dan gebeurt er niets. Is het mogelijk om te controleren door wie de setter wordt aangeroepen in c#?
2) ik maak een speciale setter voor de lazy loader (SetNameForLazyLoader of iets dergelijks). Alleen wil ik niet dat deze zichtbaar is voor de BLL. Is het mogelijk om methodes alleen voor bepaalde classes zichtbaar te maken?
Ik hoop dat ik het probleem een beetje duidelijk heb gemaakt.
Een van de problemen die nu nog openstaan is het goed laten samen werken van de unit of work en lazy loading, deze zitten namelijk nog al 's in elkaars weg. Een voorbeeldje, ik heb de volgende business class waar zowel ondersteuning voor unit of work en lazy loading in zit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Class Person {
private string _name = "";
public string Name {
get {
Load(); //support voor lazy loading
return _name;
}
set {
MarkDirty(); //object wordt als dirty aangegeven in unit of work
_name = value;
}
} |
De functie Load(), vult de instantie van het object simpelweg door iets uit de database te trekken en dan het veld up te daten middels de setter. Het probleem is dat hiermee ook het object als dirty wordt gemarkeerd, immers wordt de setter van het veld aangeroepen. Dit is te voorkomen door de status van het object te bekijken, is deze nog niet geladen dan kan het object niet als dirty worden gemarkeerd. Dit werkt opzich goed, alleen het gaat mis als je iets aan het object wilt veranderen als hij nog niet geladen is, het object wordt dan niet als dirty gemarkeerd en zal niet worden geupdate.
Het probleem: eigenlijk zou ik het liefst het object van 'achteren' (niet zichtbaar voor de BLL) willen vullen, hierbij komt de unit of work niet van te pas. Pas als het object van 'voren' wordt veranderd (tijdens gebruik in de BLL) komt de unit of work er aan te pas. Ik kan nu 2 oplossingen bedenken:
1) er wordt gecontroleerd wie de setter aanroept, is dit de BLL dan wordt het object dirty, is dit de loader (voor lazy loading) dan gebeurt er niets. Is het mogelijk om te controleren door wie de setter wordt aangeroepen in c#?
2) ik maak een speciale setter voor de lazy loader (SetNameForLazyLoader of iets dergelijks). Alleen wil ik niet dat deze zichtbaar is voor de BLL. Is het mogelijk om methodes alleen voor bepaalde classes zichtbaar te maken?
Ik hoop dat ik het probleem een beetje duidelijk heb gemaakt.
Panacea.NL als je geinteresserd bent in IT en Geneeskunde!