NHibernate in een remote / WCF scenario

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:30
Ik ben eens aan het nadenken over hoe ik NHibernate kan gebruiken in een applicatie waarin ik werk met remoting / wcf.

Dit is hoe ik de structuur zie:
Afbeeldingslocatie: http://users.pandora.be/fgzone/blog/nhibremoting/bigpict.PNG

De client communiceert mbhv remote calls met de service layer. Om een object op te halen, zal de client dus bv een remote call maken die er als volgt uit ziet:
code:
1
Customer c = RemoteProxy.GetCustomer (1);

Customer is hier een entity class die zich in het Domain Model bevindt.
De client kan hier een aantal mutaties gaan uitvoeren op Customer, en deze later dan gaan saven :
code:
1
RemoteProxy.SaveCustomer(c);

Het probleem dat ik hier zie, is 2 - ledig:
- Mijn client kan niet weten of mijn Customer object nu al of niet gewijzigd is; mijn entities hebben nl. geen state-tracking, aangezien NHibernate dit verzorgt dmv zijn ISession unit-of-work.
De kans is dus groot dat ik een onnodige remote call doe.

- Aangezien ik in een remote situatie werk, zijn mijn remote-methods stateless. Dwz dat mijn SaveCustomer method een andere ISession (een nieuwe) zal gebruiken om mijn Customer object te saven. In het geval van NHibernate betekent dit dus ook dat NHibernate niet weet of hij mijn Customer nu eigenlijk moet updaten , of niet. Dit kan dan weer problemen opleveren als je entities een version, lastupdated, lastupdatedby property bijhouden; dit kan maw tot verkeerde informatie in de DB leiden. (lastupdated, version, lastupdated by kunnen ten onrechte aangepast worden als er niets aan mijn entity veranderd is).

Nu zie ik wel een oplossing, en dat is om een soort van state-tracking in m'n entities te implementeren. (Maw, een property die aangeeft of m'n entity nieuw, gewijzigd, verwijderd, ... is). Echter, dit heeft dan weer nadelen:
- het is fragile (je moet als programmeur er iedere keer voor zorgen dat je entity als 'changed' is gemarkeerd iedere keer je iets wijzigt. Maw, in iedere property setter zal je een 'MarkDirty()' method oid moeten aanroepen. Dit is vervelend werk, en een foutje is snel gebeurd.
- je bypassed daarmee een beetje hetgeen wat NHibernate voor jou kan doen. Trouwens, Hibernate zorgt ervoor dat geassocieerde entities ook automatisch ge-updated worden, dus hier zit je ook met een probleempje.

Nu vroeg ik me af hoe anderen een dergelijk probleem opgelost hebben ? Gebruik je een volledig andere werkwijze ? Ga je gebruik maken van DTO's die je dan weer mapped met je business classes ? etc...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 03-09 19:59
Ik ben dit probleem zelf ook tegengekomen maar dan met het Entity Framework. Daar hebben ze ook geen rekening mee gehouden met N-Tier applicaties. Een work around met het Entity Framework is de state tracking mee te sturen over de lijn. Niet echt een mooie oplossing. Hoe zit dat met NHibernate? Is de state tracking serializable? Is de state tracking onderdeel van het object of is er een collectie die wijzigingen op zijn entities bij houdt? Kun je er niet voor kiezen om de collectie inclusief state tracking over de lijn te sturen? Geloof dat dat bij NHibernate entity bags heten.

Heb je hier wat aan?
http://lunaverse.wordpres...using-wcf-and-nhibernate/

http://hawvie.deviantart.com/


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Tja... :) Ik zou zeggen, kijk eens naar o/r mappers die het wel goed oplossen ;)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:30
HawVer schreef op dinsdag 29 juli 2008 @ 13:29:
Ik ben dit probleem zelf ook tegengekomen maar dan met het Entity Framework. Daar hebben ze ook geen rekening mee gehouden met N-Tier applicaties. Een work around met het Entity Framework is de state tracking mee te sturen over de lijn. Niet echt een mooie oplossing. Hoe zit dat met NHibernate? Is de state tracking serializable? Is de state tracking onderdeel van het object of is er een collectie die wijzigingen op zijn entities bij houdt? Kun je er niet voor kiezen om de collectie inclusief state tracking over de lijn te sturen? Geloof dat dat bij NHibernate entity bags heten.
Je doelt hier op je DataContext in EF en de ISession in NHibernate ?
Volgens mij is die Session wel serializable ja. Dit was ook een workaround die ik evt in gedachten had, maar ideaal zou zijn als mijn ISession enkel in mijn remote interface bestond, en m'n client er dus geen weet van heeft. Het zou echter wel een oplossing kunnen zijn, maar zoals je zelf al zegt: niet de ideale.
Ik was dat artikel ook al eens tegengekomen, maar daar wordt de problematiek die ik nu tegenkom volgens mij niet echt behandeld. Ik zal 't nog eens doornemen, en misschien stel ik mijn vraag daar ook wel eens in de comments. :P
EfBe schreef op dinsdag 29 juli 2008 @ 18:44:
Tja... :) Ik zou zeggen, kijk eens naar o/r mappers die het wel goed oplossen ;)
Toen ik vandaag in de Ardennen aan het rondlopen was, is dit ook even in mijn gedachten opgekomen. :P

[ Voor 9% gewijzigd door whoami op 29-07-2008 21:42 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • tijn
  • Registratie: Februari 2000
  • Laatst online: 01-08 16:49
whoami schreef op maandag 28 juli 2008 @ 23:05:
Nu vroeg ik me af hoe anderen een dergelijk probleem opgelost hebben ? Gebruik je een volledig andere werkwijze ? Ga je gebruik maken van DTO's die je dan weer mapped met je business classes ? etc...
Hoe aantrekkelijk het in eerste instantie ook mag lijken om je domein objecten over het netwerk te sturen, op een gegeven moment loop je altijd tegen vervelende issues aan. Bij sommige O/R mappers haal je een afhankelijkheid naar Session/DataContext mee over de lijn, maar zelfs als dit niet het geval is, zit je met de vraag wat je nou precies met je domein model aan de client kant gaat doen. In het ergste geval heb je je complete object graph ook nodig aan de client omdat je toevallig ergens diep in je hierarchie een bepaalde property nodig hebt.
Daarom kies ik er persoonlijk voor om alleen simpele DTO's over de lijn te gooien. Met .NET 3.5 is het echt bijna geen extra werk (automatic properties, object initializers en een scheutje Linq).

Cuyahoga .NET website framework


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:30
Als je gebruik gaat maken van DTO's , ga je dan bepaalde logica die je ook aan de clientside kunt gebruiken, gaan dupliceren ?

De remote service krijgt dan -in het geval van die savecustomer bv- een CustomerDTO binnen. Dan moet die method wel eerst een select gaan doen om de Customer business entity op te halen, en dan ga je die 2 moeten mergen of hoe zie je dat dan ?
Of kan ik hier gewoon mijn DTO opnieuw mappen naar een business class, en deze dan gewoon gaan saven dmv SaveOrUpdateCopy ?

[ Voor 63% gewijzigd door whoami op 30-07-2008 00:24 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Ruudjah
  • Registratie: November 1999
  • Laatst online: 06-09 20:58

Ruudjah

2022

DIT BERICHT IS PREVENTIEF VERWIJDERD DOOR DE GEBRUIKER

[ Voor 105% gewijzigd door Ruudjah op 02-12-2009 00:18 ]

TweakBlog


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:30
Ik ben ook nog op dit gestoten:
http://www.hibernate.org/161.html

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 03-09 19:59
EfBe schreef op dinsdag 29 juli 2008 @ 18:44:
Tja... :) Ik zou zeggen, kijk eens naar o/r mappers die het wel goed oplossen ;)
Ik wist dat ie zou komen.. :P

http://hawvie.deviantart.com/

Pagina: 1