Hej!TÀnkte fÄ lite synpunkter pÄ att anvÀnda entitymanager frÄn factory för att skapa en entity. (Hittade ingen factory som gör detta i DDDSample)
Mitt resonemang gÄr ungefÀr sÄhÀr:
En entity jÀmförs uteslutande pÄ ID, det Àr en del av att vara valid.DÀrför mÄste factory:n som skapar entity:n sÀtta ID.
Det beror pïżœ vilka patterns man anvïżœnder. Exempelvis om du anvïżœnder
EventSourcing sïżœ mïżœste id't genereras av kommandot och anvïżœndas som
input till eventet, som i sin tur skapar entity med det id't. Annars
funkar inte replay.
> I praktiken vill man generera ID frïżœn databas, och alltsïżœ vill jag
> anvïżœnda EntityManagern fïżœr att generera ID.
I praktiken har jag alltid anvïżœnt en UUID generator. Se ovan. Och jag
skiljer mellan id'n fïżœr datanbaser och fïżœr mïżœnniskor. Exempelvis
order-id ïżœr fïżœr mïżœnniskor, och kan dïżœrfïżœr sïżœttas nïżœr ordern ïżœr bekrïżœftad
-> inga hïżœl i sekvensen. Funkar finfint.
> - Vi har ingen garanti fïżœr att orderId faktiskt anvïżœnds (att motsvarande
> order persisteras), vilket skapar hïżœl i orderid-sekvensen, vilket stïżœr
> administratïżœrer (Men det kan vi egentligen aldrig garantera)
Se ovan!
> - Persistens-kod hamnar pïżœ tvïżœ olika stïżœllen, OrderFactory och
> OrderRepository.
OrderFactory och OrderRepository ïżœr vïżœl interface, sïżœ borde kunna
implementeras av samma objekt?
/Rickard
>
> Och jag skiljer mellan id'n för datanbaser och för mÀnniskor.
InstÀmmer, jag försöker undvika att ge tekniska konstruktioner
domÀnlogisk mening.
> Exempelvis order-id Àr för mÀnniskor, och kan dÀrför sÀttas
> nÀr ordern Àr bekrÀftad -> inga hÄl i sekvensen. Funkar finfint.
>
>> - Persistens-kod hamnar pÄ tvÄ olika stÀllen, OrderFactory och
>> OrderRepository.
>
> OrderFactory och OrderRepository Àr vÀl interface, sÄ borde kunna
> implementeras av samma objekt?
Ja, och interfacen kan ligga i paket xyz.domain medan implementationen
ligger i xyz.infrastructure.sqldb el likn. SĂ„ blir xyz.domain helt
fritt frÄn referenser till specifik infrastruktur och kan t ex
enhetstestas utan annat pÄ classpath.
Dan
> /Rickard
>
> --
> Det hÀr meddelandet skickas till dig eftersom du prenumererar pÄ gru
> ppen DDD Sverige i Google Groups.
> Om du vill göra ett inlÀgg i den hÀr gruppen skickar du e-post till dddsverige@googlegroups.
> com.
> Om du vill sluta prenumerera pÄ den hÀr gruppen skickar du e-post ti
> ll dddsverige+...@googlegroups.com.
> För fler alternativ, besök gruppen pÄ http://groups.google.com/group/dddsverige?hl
> =sv.
>
> Ja, och interfacen kan ligga i paket xyz.domain medan implementationen ligger i xyz.infrastructure.sqldb el likn. SÄ blir xyz.domain helt fritt frÄn referenser till specifik infrastruktur och kan t ex enhetstestas utan annat pÄ classpath.
Va? Enhetstestar du interfacet? ;-)
Mvh
Niclas
Visserligen dokumenterar jag gÀrna interfacet med enhetstester, men
det var inte riktigt det jag hade i Ätanke.
Jag tÀnkte frÀmst pÄ att andra klasser som har beroenden till fabrik
och repository inte behöver nÄgra utÄtgÄende beroenden som i sin
tur sprider sig till en massa andra paket. IstÀllet blir domÀnpaketet
sjÀlvinnehÄllande.
Dan
>
Ja, och interfacen kan ligga i paket xyz.domain medan implementationen ligger i xyz.infrastructure.sqldb el likn. SÄ blir xyz.domain helt fritt frÄn referenser till specifik infrastruktur och kan t ex enhetstestas utan annat pÄ classpath.
Va? Enhetstestar du interfacet? ;-)
Visserligen dokumenterar jag gÀrna interfacet med enhetstester, men det var inte riktigt det jag hade i Ätanke.
Jag tÀnkte frÀmst pÄ att andra klasser som har beroenden till fabrik och repository inte behöver nÄgra utÄtgÄende beroenden som i sin tur sprider sig till en massa andra paket. IstÀllet blir domÀnpaketet sjÀlvinnehÄllande.
--
Det hÀr meddelandet skickas till dig eftersom du prenumererar pÄ gruppen DDD Sverige i Google Groups.
Om du vill göra ett inlÀgg i den hÀr gruppen skickar du e-post till dddsv...@googlegroups.com.
Om du vill sluta prenumerera pÄ den hÀr gruppen skickar du e-post till dddsverige+...@googlegroups.com.
I praktiken har jag alltid anvÀnt en UUID generator. Se ovan. Och jag skiljer mellan id'n för datanbaser och för mÀnniskor. Exempelvis order-id Àr för mÀnniskor, och kan dÀrför sÀttas nÀr ordern Àr bekrÀftad -> inga hÄl i sekvensen. Funkar finfint.
OrderFactory och OrderRepository Àr vÀl interface, sÄ borde kunna implementeras av samma objekt?
- Persistens-kod hamnar pÄ tvÄ olika stÀllen, OrderFactory och
OrderRepository.
I mina system har ALLA entities ALLTID ett UUID som identitet, ur ett
tekniskt perspektiv. Sedan har vi "ïżœrendeid" (vi gïżœr Case Management),
personnr, och lite annat fïżœr sïżœkning och presentation, men det ïżœr HELT
andra usecase.
/RIckard
4 nov 2010 kl. 10.13 skrev Jonas Andersson <jona...@gmail.com>:
> I praktiken har jag alltid anvÀnt en UUID generator. Se ovan. Och ja
> g skiljer mellan id'n för datanbaser och för mÀnniskor. Exempelvis
> order-id Àr för mÀnniskor, och kan dÀrför sÀttas nÀr ordern
> Àr bekrÀftad
>
>
> Det kÀnns inte riktigt rÀtt för mig, en orders identet bestÀms ju
> dĂ„ inte lĂ€ngre av orderid, vilket jag tycker att den borde (Ă
> andra sidan Àr jag fortfarande jag, oavsett vad mitt personnr Àr). M
> Äste fundera mer pÄ det.
Jag brukar tÀnka pÄ det som att orderid Àr ett verksamhetsattribut,
vilket som helst. Sedan finns det attribut eller kombinationer av
attribut som unikt pekar ut (högst) en entitet - i vissa .NET-kretsar
har jag hört sÄdana uppsÀttningar kallas "determinanter".
> Instinktivt ogillar jag ocksÄ att en Entity innehÄller saker av "ren
> t teknisk" natur, vilket ju UUID blir - Ordern blir inte lika "ren".
> Men det löser onekligen upp beroendet mellan Factory och EntityMana
> ger.
Egentligen Àt uuid bara ett implementationstrick. TÀnk att vi hade en
oÀndlig minnes-heap pÄ en krashsÀker dator som aldrig behövde
startas om. DĂ„ skulle varje objekt identifieras av den minnesadress
den lÄg pÄ och inga uuid skulle behövas. DÀremot skulle en order
fortfarande ha sitt verksamhetsmÀssiga orderid.
Nu har vi ingen sÄdan heap utan mÄste spara ner vÄra objekt i
diverse persistensmekanismer. DÄ Àr uuid bara ett trick för att
spara och Äterskapa objektet - egentligen bara en "minnesadress" i det
oÀndliga persistensminnet.
NÀr jag tÀnker pÄ det sÀttet kÀnns det inte sÄ stötande att det
finns ett "tekniskt" attribut i en entitetsimplementation. Ă
tminstone
inte mer stötande Àn att en service av tekniska skÀl skulle kunna
hÄlla en Connection eller Socket öppen under lite lÀngre tid.
Dan
Exemplet med personnummer Àr bra (och om jag inte minns fel anvÀnds
det av Fowler i PoEAA runt precis detta resonemang).
Att det finns en identitet i domÀnen, hÀr orderid, Àr en dessutom en
viktig observation, dÄ det ger tydlig hjÀlp i att sortera ut
entiteterna frÄn vÀrdeobjekten.
/Patrik
2010/11/4 Dan Bergh Johnsson <dan.bergh...@gmail.com>:
>
>
> 4 nov 2010 kl. 10.13 skrev Jonas Andersson <jona...@gmail.com>:
>
>> I praktiken har jag alltid anvÀnt en UUID generator. Se ovan. Och jag
>> skiljer mellan id'n för datanbaser och för mÀnniskor. Exempelvis order-id Àr
>> för mÀnniskor, och kan dÀrför sÀttas nÀr ordern Àr bekrÀftad
>>
>>
>> Det kÀnns inte riktigt rÀtt för mig, en orders identet bestÀms ju dÄ inte
>> lĂ€ngre av orderid, vilket jag tycker att den borde (Ă
andra sidan Àr jag
>> fortfarande jag, oavsett vad mitt personnr Àr). MÄste fundera mer pÄ det.
>
> Jag brukar tÀnka pÄ det som att orderid Àr ett verksamhetsattribut, vilket
> som helst. Sedan finns det attribut eller kombinationer av attribut som
> unikt pekar ut (högst) en entitet - i vissa .NET-kretsar har jag hört sÄdana
> uppsÀttningar kallas "determinanter".
>
>> Instinktivt ogillar jag ocksÄ att en Entity innehÄller saker av "rent
>> teknisk" natur, vilket ju UUID blir - Ordern blir inte lika "ren". Men det
>> löser onekligen upp beroendet mellan Factory och EntityManager.
>
> Egentligen Àt uuid bara ett implementationstrick. TÀnk att vi hade en
> oÀndlig minnes-heap pÄ en krashsÀker dator som aldrig behövde startas om. DÄ
> skulle varje objekt identifieras av den minnesadress den lÄg pÄ och inga
> uuid skulle behövas. DÀremot skulle en order fortfarande ha sitt
> verksamhetsmÀssiga orderid.
>
> Nu har vi ingen sÄdan heap utan mÄste spara ner vÄra objekt i diverse
> persistensmekanismer. DÄ Àr uuid bara ett trick för att spara och Äterskapa
> objektet - egentligen bara en "minnesadress" i det oÀndliga
> persistensminnet.
>
> NÀr jag tÀnker pÄ det sÀttet kÀnns det inte sÄ stötande att det finns ett
> "tekniskt" attribut i en entitetsimplementation. Ă
tminstone inte mer
> stötande Àn att en service av tekniska skÀl skulle kunna hÄlla en Connection
> eller Socket öppen under lite lÀngre tid.
>
> Â Dan
>
Dan
4 nov 2010 kl. 20.23 skrev Patrik Fredriksson <patrik.fr...@citerus.se
>:
> Om du vill göra ett inlÀgg i den hÀr gruppen skickar du e-post till dddsverige@googlegroups.
> com.
> Om du vill sluta prenumerera pÄ den hÀr gruppen skickar du e-post ti
> ll dddsverige+...@googlegroups.com.
Alla egna entititesklasser Àrver frÄn basklassen Entity som har överlagrar funktionerna Equals och GetHashCode (dessa funktioner Àr viktiga för NHibernate (som Àr OR-ramverket som som Sharp Architecture anvÀnder)
Equals och GetHashCode baseras pÄ de properties som Àr markerade med "Domain Signature" attributet
Entity-klassen innehÄller ocksÄ propertyn Id som Àr en integer och Àr objektets tekniska id.
(Om man behöver jobba med annat Àn integer som teknisk nyckel finns en annan klass att Àrva ifrÄn)
Exempel pÄ anvÀndning
PÄ klassen Person sÀtter man DomainSignature-attributet pÄ personnummer propertyn
Detta gör att du kan skriva personA.Equals(personB) och fÄ svaret true om instanserna har samma personnummer.
För valueobjects finns basklassen ValueObject dÀr du du inte kan sÀtta DomainSignature eftersom alla egenskaper pÄ ett sÄdant objekt avgör om det Àr likadant som ett annat
/Mikael Egnér
-----Ursprungligt meddelande-----
FrÄn: dddsv...@googlegroups.com [mailto:dddsv...@googlegroups.com] För Dan Bergh Johnsson
Skickat: den 4 november 2010 22:24
Till: dddsv...@googlegroups.com
Kopia: dddsv...@googlegroups.com
Ămne: Re: DDD i java: AnvĂ€nda EntityManager för att skapa ID i IdentityFactory
Dan
--
Det hÀr meddelandet skickas till dig eftersom du prenumererar pÄ gruppen DDD Sverige i Google Groups.
Om du vill göra ett inlÀgg i den hÀr gruppen skickar du e-post till dddsv...@googlegroups.com.
Detta verkar gïżœra antagandet att tvïżœ entiteter som ïżœr domïżœn-mïżœssigt
identiska har olika tekniska id'n. Korrekt? Hur kan det komma sig att
det finns tvïżœ entiteter som representerar samma domïżœnobjekt? Varfïżœr inte
bara jïżœmfïżœra pïżœ id't?
/Rickard
Dan
5 nov 2010 kl. 02.08 skrev Rickard Ăberg <rickar...@gmail.com>:
> On 2010-11-05 06.21, Mikael Egnér wrote:
>> I Sharp Architecture (ramverk för .Net) sÀtter man ett attribut
>> "Domain Signature" pÄ de properties som unikt identifierar ett obj
>> ekt
>> verksamhetsmÀssigt.
>>
>> Alla egna entititesklasser Àrver frÄn basklassen Entity som har
>> överlagrar funktionerna Equals och GetHashCode (dessa funktioner Àr
>> viktiga för NHibernate (som Àr OR-ramverket som som Sharp
>> Architecture anvÀnder) Equals och GetHashCode baseras pÄ de
>> properties som Àr markerade med "Domain Signature" attributet
>>
>> Entity-klassen innehÄller ocksÄ propertyn Id som Àr en integer och
>> Àr
>> objektets tekniska id. (Om man behöver jobba med annat Àn integer
>> som
>> teknisk nyckel finns en annan klass att Àrva ifrÄn)
>>
>> Exempel pÄ anvÀndning PÄ klassen Person sÀtter man
>> DomainSignature-attributet pÄ personnummer propertyn
>>
>> Detta gör att du kan skriva personA.Equals(personB) och fÄ svaret
>> true om instanserna har samma personnummer.
>
> Detta verkar göra antagandet att tvÄ entiteter som Àr domÀn-
> mÀssigt identiska har olika tekniska id'n. Korrekt? Hur kan det komm
> a sig att det finns tvÄ entiteter som representerar samma domÀnobjek
> t? Varför inte bara jÀmföra pÄ id't?
>
> /Rickard
> Ofta ser man dÀrför kod som ser ut sÄ hÀr (eller snarlikt):
>
> Person p = new Person(...); // utan personnummer
> p.makePartOf(folksamling);
> personRepository.save(p);
>
> Mycket kladdigare. Vad Àr personRepository för nÄgot?, undrar min
> domÀnexpert.
Fast det dÀr Àr kod som finns dÀr av tekniska skÀl och inte nÄgot som domÀnexperten skall behöva se? Anledningen att du ofta ser sÄdan kod Àr att folk av nÄgon anledning verkar ha lite svÄrt att skilja pÄ vad och hur (som inte skall vara pÄ samma stÀlle). Jag tror det beror pÄ att nÀr vi skriver koden tÀnker vi alltför lÀtt pÄ hur man gör en sak, och bryter ned det steg för steg just pÄ den platsen vi rÄkar komma pÄ "att" vi vill göra nÄgot.
Vad vill jag göra? LÀgga till personen i folksamlingen.
Hur gör jag det? Skapa ny instans, makePartOf o.s.v.
Av mÄnga skÀl Àr det en god idé att hur-koden ligger i en annan metod Àn dÀr vad-koden (d.v.s. intentionen, den som domÀnexperten dessutom Àr intresserad av) Àr. "Vad" blir bra metodanrop och "hur" passar ofta som smÄ, fina, fokuserade metoder.
Om domÀnexperten behöver se repot sÄ hade jag gÀrna döpt det till "persons" helt enkelt. Eller kanske Àven om de inte behöver se det.
Mvh
Niclas
---
http://niclasnilsson.se
http://twitter.com/niclasnilsson
On 2010-11-05 06.21, Mikael Egnér wrote:
I Sharp Architecture (ramverk för .Net) sÀtter man ett attribut
"Domain Signature" pÄ de properties som unikt identifierar ett objekt
verksamhetsmÀssigt.
Alla egna entititesklasser Àrver frÄn basklassen Entity som har
överlagrar funktionerna Equals och GetHashCode (dessa funktioner Àr
viktiga för NHibernate (som Àr OR-ramverket som som Sharp
Architecture anvÀnder) Equals och GetHashCode baseras pÄ de
properties som Àr markerade med "Domain Signature" attributet
Entity-klassen innehÄller ocksÄ propertyn Id som Àr en integer och Àr
objektets tekniska id. (Om man behöver jobba med annat Àn integer som
teknisk nyckel finns en annan klass att Àrva ifrÄn)
Exempel pÄ anvÀndning PÄ klassen Person sÀtter man
DomainSignature-attributet pÄ personnummer propertyn
Detta gör att du kan skriva personA.Equals(personB) och fÄ svaret
true om instanserna har samma personnummer.
Detta verkar göra antagandet att tvÄ entiteter som Àr domÀn-mÀssigt identiska har olika tekniska id'n. Korrekt? Hur kan det komma sig att det finns tvÄ entiteter som representerar samma domÀnobjekt? Varför inte bara jÀmföra pÄ id't?
/Rickard