Toon posts:

Data transfer objects

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil gebruik gaan maken van Data Transfer Objects (DTO's) om data aan de user interface te geven.

Ik heb bijvoorbeeld een class dtoDossier en een class dtoDocument. In het dtoDossier zit een verzameling documenten en nog wat andere attributen. Er zitten geen methods in, alleen data:

C#:
1
2
3
4
5
6
7
8
dtoDossier
==========
+ ArrayList Documenten
+ string Eigenaar
+ date CreatieDatum
+ string Status
+ string Locatie
+ string LaatsteActie


Als ik een document wil toevoegen aan het dossier dan kan dat via de businesslogic. Ik stel me zo voor dat ik een dossier en een document doorgeef aan de operatie VoegtoeDocument:

C#:
1
2
3
4
5
6
blDossier
==========
+ VoegtoeDocument (Dossier, Document)
+ Verstuur (Dossier)
+ SluitAf (Dossier)
...


De user interface geeft dus aan: ik heb dit dossier en daar moet dit document in terecht komen.
De businesslogic gaat dan zelf bekijken of het document wel aan het dossier mag/kan worden toegevoegd. En ook wordt er bepaald of er wel documenten in het dossier terecht mogen/kunnen komen etc.


Het probleem:
Omdat in dtoDossier een ArrayList met dtoDocumenten zit, kan de user interface zomaar een dtoDocument gaan toevoegen aan de verzameling. Dit wil ik niet, want alle checks op businesslogic worden daarmee omzeild.
Ik kan echter ook geen read-only verzameling gebruiken, want die kan ik niet laten vullen door de businesslogic.

Heeft iemand hier al ervaring mee en een idee voor een oplossing?

Verwijderd

Als je in dtoDossier ervoor zorgt dat de Documenten ArrayList read only is, en via de UI alleen maar toevoegingen / wijzigingen kunnen worden toegevoegd aan bv. een DocumentMutaties ArrayList, kan je BLL alsnog die mutaties valideren en indien goed bevonden mergen met de Documenten lijst.

Niet de meest gebruikersvriendelijke UI, omdat de gebruiker pas feedback krijgt of 't allemaal wel mocht wanneer 'ie de wijzigingen aan de BLL worden aangeboden, maar daar is ook wel een mouw aan te passen. Bv door aan de BLL iets als een ValideerDocument(Dossier, Document) toe te voegen die direct kan vertellen of 't mag, en zo nee waarom.

Je krijgt dan wel meer communicatie tussen presentation layer en BLL, en bij DTO's was 't juist de bedoeling om die te beperken, maar dat blijft altijd een afweging...

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 16 mei 2006 @ 20:14:
Als je in dtoDossier ervoor zorgt dat de Documenten ArrayList read only is
Das een goede opmerking. Ik had op een gegeven moment ook een idee in die richting. Ik liep echter vast op het punt dat de verzameling read-only moet zijn voor de user interface, maar dat de business logic er wel gegevens in kan stoppen. Met andere woorden, iets is read-only of iets is niet read-only, een andere mogelijkheid zie ik niet. En daar loop ik denk ik vast, toch?

Verwijderd

Nee hoor, tenminste in .NET niet.

Maak de arraylist private.
Een public methode om de dossiers op te vragen voor de gui, waar ook alle checks in zitten.
Een 'friend'/'shared' methode om de data erin zetten, deze is dus benaderbaar in de BLL.

Verwijderd

Verwijderd schreef op dinsdag 16 mei 2006 @ 23:13:
[...]


Das een goede opmerking. Ik had op een gegeven moment ook een idee in die richting. Ik liep echter vast op het punt dat de verzameling read-only moet zijn voor de user interface, maar dat de business logic er wel gegevens in kan stoppen. Met andere woorden, iets is read-only of iets is niet read-only, een andere mogelijkheid zie ik niet. En daar loop ik denk ik vast, toch?
Je kan zoiets als volgt voor je zien:

C#:
1
2
3
4
5
IList<DTOobject> list = new Collection<DTOobject>;
// vul je lijst ...

// nieuwe collection wrapper toekennen:
return new ReadOnlyCollection<DTOobject>(list);

[ Voor 9% gewijzigd door Verwijderd op 18-05-2006 18:01 ]