Jag sitter på ett lite problem som jag inte kan hitta någon snygg lösning på, hoppas på lite hjälp här. Det här är väl egentligen ett problem med det språk du använder. (C# gissar jag?) INotifyCollectionChanged finns ju alltid, blir samma koppling som Order/PresentationOrder. "för enskilda objekt, men saknar samma event för samlingar av objekt." Efter en del funderande och testande så tror jag jag har hittat en lösning som får duga...Problem med Collection av PresenationObject i en DDD lösning...
Jag har en DDD lösning där jag har en cache som håller en collection av mina DDD-object och i min WPF application så vilja jag ha en collection av mina PresentationObject.
Så i cachen så har jag en MyCollection<Order> medans mitt WPF formulär skall använda sig av MyCollection<PresenationOrder>. Jag låter min PresenationOrder ta ett Order object och iprincip bara wrappa detta och kollar om Order implementerar INotifyPropertyChanged och så fall lyssnar PresentationOrder på förändring på Order objectet och skickar dessa vidate till sitt eget NotifyPropertyChanged event.
Så det som fungerar är att jag får ut en lista av mina Orders (från cachen) som en lista med PresenationOrder och om jag ändrar på någon information i mina Orders object i cachen så syns detta direkt i ListView, så långt allt bra.
Mitt problem blir när jag plockar bort/lägger till ett object i min cached MyCollection<Order> som ligger i cachen. Eftersom jag har skapat en ny lista MyCollection<PresenationOrder> så kommer ju CollectionChangedEventet att castas från MyCollection<Order> medans det är MyCollection<PresenationOrder> som är bunden till min ListView kontroll. Vilket gör att inga förändringar syns i min ListView
Så det jag vill göra är att när MyCollection<Order> ändras så skall den notificera MyCollection<PresenationOrder> vad som har hänt, som i sin tur genomför dessa förändringar och sedan reser ett CollectionChanged event hos sig som ListView kan utföra.
En lösning som jag kan tänka mig löser detta på är om MyCollection<PresenationOrder> har en referens till MyCollection<Order> som ligger i cachen, och jag vet inte om jag vill ha denna hårda koppling här. En annan lösning vore att bygga någonsorts Publish/Subscribe metod som får hantera detta, här slipper jag den hårda bindingen men samtidigt blir det bra mycket mer komplext att fixa till.
År det någon som har en annan bättre ide, eller har testat något av det och kan rekomendera den ena metoden framför den andra.
- MSv: Problem med Collection av PresenationObject i en DDD lösning...
Egentligen finns ju inga "events", utan det är en språkkonstruktion som implementerar Observer pattern. Problemet är att det du normalt sett har ett visst event, NotifyPropertyChanged, för enskilda objekt, men saknar samma event för samlingar av objekt. Det är en intressant diskussion i sig, men det leder direkt till funderingen om hur du har det för enskilda objekt; där wrappar du en Order i en PresentationOrder?
Men du tycker att en referens från MyCollection<PresentationOrder> till MyCollection<Order> är en för hård koppling?
Är inte wrappingen en jävligt hård koppling till att börja med?Sv: Problem med Collection av PresenationObject i en DDD lösning...
Ska själv strax börja med samma problematik, funderar på att bara ha en tunn wrapper runt listan, istället för att ha kopia av datan.
Det är konstigt att det inte finns fler patterns och lösningar kring sånt här, är ju ett väldigt vanligt problem. Sv:Problem med Collection av PresenationObject i en DDD lösning...
Nej då det finns event för förändringar av listan och de är dessa som jag vill att min "nya" lista skall "upptäcka" och göra förändringar med hjälp av.
"Men du tycker att en referens från MyCollection<PresentationOrder> till MyCollection<Order> är en för hård koppling?
Är inte wrappingen en jävligt hård koppling till att börja med?"
Jo det är det, och jag misstänker att för att få det att fungera på någolunda enkelt sätt så behöver jag en referens i min MyCollection<PresentationOrder> till MyCollection<Order>.
- MSv: Problem med Collection av PresenationObject i en DDD lösning...
Jag plockar bort min hårda koppling mellan Order och PresenationOrder också som en liten bonus. Det hela går ut på att jag använder mig av en EventBroker som kopplar ihop Order PropertyChangedEventetn med en metod i PresenationOrder, så när min Order reser ett PropertyChanged event så kommer den information skickas till den PresentationOrder som jag skapat för detta Order.
Samma sak blir för Collection<PresenationOrder> som kommer lyssna på CollectionChanged eventet från Collection<Order>.
Kräver att jag fixar lite basklasser till dels mina Presentationobject och domänobjekt men det lär man ju ha ändå. Dels så fick jag skriva en EventBroker själv så jag slapp ifrån att använda Attribute i koden och löser det nu i coden dynamiskt och kan dessutom styra att property namn på Order endast uppdaterar Propertyn namn på PresentationOrder och inte någon annat objekt med property Namn.
Blir en hel del testande av EventBrokern innan den blir färdig. Men jag tror det blir en snygg och löskopplad lösning.
- M