Ik zit met een ei. 
Stel dat je een applicatie hebt, die op een n-tier manier gebouwd wordt.
Ik heb in die applicatie bv een data-access laag en een 'provider'-laag.
M'n client praat met m'n provider, en m'n provider returned business objecten en is verantwoordelijk om business objecten te saven.
bv:
De GetCustomer haalt in dit geval de klant op met zijn orders bv. (Customer is in dit geval dus een 'aggregate root' (om in het Evans woorden te zeggen), die een collectie heeft van Order objecten).
De Save method gaat in dit geval de wijzigingen aan de customer saven, en ook de wijzigingen aan de Order objecten.
Allemaal goed en wel, in dit geval zou je kunnen zeggen dat de Transactie-handling (start-transaction call, commit en rollback call) in de CustomerProvider thuis horen.
Echter, in bepaalde situaties is dit niet voldoende. Soms kan het zijn dat ik mijn transactie over meer dan één 'aggregate root' wil laten lopen.
Daarom zou het dus eigenlijk het beste zijn dat ik mijn 'client' verantwoordelijk laat zijn voor het starten / committen / rollbacken van transacties.
Echter, dan is nu mijn vraag hoe ik dat het best doorgeef aan m'n providers...
Ik kan dat natuurlijk wel zo doen:
Echter, dan 'vervuil' ik m'n client wel met dat transactie-gedoe, maar ik zie niet in hoe het anders kan.
Ik heb dan ook wel een extra parameter in m'n Save method die het boeltje er imho ook niet echt duidelijker op maakt.
Iemand die hier een goed idee over heeft ?
Stel dat je een applicatie hebt, die op een n-tier manier gebouwd wordt.
Ik heb in die applicatie bv een data-access laag en een 'provider'-laag.
M'n client praat met m'n provider, en m'n provider returned business objecten en is verantwoordelijk om business objecten te saven.
bv:
code:
1
2
3
4
5
| Customer c = customerProver.GetCustomer (id); // do some stuff customerProvider.Save (c); |
De GetCustomer haalt in dit geval de klant op met zijn orders bv. (Customer is in dit geval dus een 'aggregate root' (om in het Evans woorden te zeggen), die een collectie heeft van Order objecten).
De Save method gaat in dit geval de wijzigingen aan de customer saven, en ook de wijzigingen aan de Order objecten.
Allemaal goed en wel, in dit geval zou je kunnen zeggen dat de Transactie-handling (start-transaction call, commit en rollback call) in de CustomerProvider thuis horen.
Echter, in bepaalde situaties is dit niet voldoende. Soms kan het zijn dat ik mijn transactie over meer dan één 'aggregate root' wil laten lopen.
Daarom zou het dus eigenlijk het beste zijn dat ik mijn 'client' verantwoordelijk laat zijn voor het starten / committen / rollbacken van transacties.
Echter, dan is nu mijn vraag hoe ik dat het best doorgeef aan m'n providers...
Ik kan dat natuurlijk wel zo doen:
code:
1
2
3
4
5
6
| transactionSession = App.BeginTransaction(); customerProvider.Save (transactionSession, customer); customerProvider.Save (transactionSession, customer2); transactionSession.Commit(); |
Echter, dan 'vervuil' ik m'n client wel met dat transactie-gedoe, maar ik zie niet in hoe het anders kan.
Ik heb dan ook wel een extra parameter in m'n Save method die het boeltje er imho ook niet echt duidelijker op maakt.
Iemand die hier een goed idee over heeft ?
https://fgheysels.github.io/