webForumDet fria alternativet

M-V-VM modellen?

4 svar · 417 visningar · startad av Gladh

GladhMedlem sedan maj 20012 812 inlägg
#1

Är det någon som har använt sig av M-V-VM modellen och där även haft en cache för att cacha data.

Jag håller på att implementera M-V-VM i ett DDD projekt, där jag skall kunna köra min WPF-klient i ett "offline" läge, så jag måste ha en cache där data kan hållas även om kopplingen till min services går ner.

Cachen innehåller observablecollection för att få databiningen att fungera som den skall mot WPF-kontrollerna. Mitt problem är att jag tycker att jag får för mycket logik i min VM-klass, som bör ligga i mitt DDD typ i en applikationservices, men samtidigt så tycker jag att min cache bör ligga i presentationslagret eftersom den inkluderar observablecollections.

Här är lite kod som jag tycker borde flyttas ner från min VM-klass till DDD lagret.

            AddQueueWorkerItems();
            if (!CacheManager.Instance.BuyerCollection.InstancedWithData)
            {
                IEnumerable<IBuyer> tmpBuyers = _buyerRepository.GetBuyers();
                IList<BuyerPresentationModel> tmpBuyerPresentations = new List<BuyerPresentationModel>();
                foreach (IBuyer tmpBuyer in tmpBuyers)
                    tmpBuyerPresentations.Add(new BuyerPresentationModel(tmpBuyer));

                CacheManager.Instance.BuyerCollection.ClearCollectionAndAddItems(tmpBuyerPresentations.AsEnumerable<BuyerPresentationModel>());
            }

            this.Dispatcher.Invoke(DispatcherPriority.ApplicationIdle,
                new ThreadStart(delegate
                {
                    this.BuyerCollection = CacheManager.Instance.BuyerCollection.Collection;
                    RemoveQueueWorkerItems();
                }));

Koden

                IEnumerable<IBuyer> tmpBuyers = _buyerRepository.GetBuyers();
                IList<BuyerPresentationModel> tmpBuyerPresentations = new List<BuyerPresentationModel>();
                foreach (IBuyer tmpBuyer in tmpBuyers)
                    tmpBuyerPresentations.Add(new BuyerPresentationModel(tmpBuyer));

Är den som jag önskar flytta ner, tyvärr har den referenser till myn BuyerPresentationModel som ligger i Presentationslagret.

Även en sådan sak som att lägga till en ny Buyer skulle kräva en massa logik i min VM-modell eftersom den dels måste läggas till i cachen och sedan till repositoryt och det är verkligen logik som borde ligga i DDD-lagret.

Det finns en lösning och det är att flytta ner BuyerPresentationModel och cachen till mitt DDD, men det känns inte helt rätt.

Någon som har gjort något liknande som har några ideer...

- M

NickemannenMedlem sedan aug. 20003 575 inlägg
#2

Måste det som ligger i cachen vara direkt bundet mot UI?

Isåfall hade du kunnat låta cachen underrätta din ViewModel att det finns uppdateringar i cachen.

GladhMedlem sedan maj 20012 812 inlägg
#3

nickemannen skrev:

Måste det som ligger i cachen vara direkt bundet mot UI?

Isåfall hade du kunnat låta cachen underrätta din ViewModel att det finns uppdateringar i cachen.

Måste och måste, det är ju smidigt i och med att det är en observableCollections som ligger där, och då slipper jag ju själv hantera eventen om att något har hänt i cachen, eller till och med i ett object som ligger i collection som ligger i cachen...

- M

NickemannenMedlem sedan aug. 20003 575 inlägg
#4

Jo självklart, men det skulle kunna vara en lösning.

Jag vet inte hur du har det uppbyggt men jag hade haft FakeServices som antingen arbetar direkt mot servicen eller sin lokala cache. Detta hade lett till att resten av applikationen inte hade vetat om den är offline eller online. Och eftersom min Service inte hade retunerat något med ObservableCollection's så hade jag nog inte använt mig av det i cachen eftersom i onlineläge så använder den sig inte av cachen?

GladhMedlem sedan maj 20012 812 inlägg
#5

nickemannen skrev:

Och eftersom min Service inte hade retunerat något med ObservableCollection's så hade jag nog inte använt mig av det i cachen eftersom i onlineläge så använder den sig inte av cachen?

Nu är ju inte bara cachen tillför att fungera i offline läge, utan även för prestandan, att hämta alla artiklar tusental varje gång som man vill lista de är inte speciellt effektivt, så iprincip så går mitt program alltid mot cachen, och finns det ingen data där i och den är online så hämtas data, om den är offline så används cachen och en varningsruta kommer upp och säger att eftersom man är offline så är det inte säkert att information är helt korrekt just nu...

Jag tror dock att jag flyttar ner cachen och presentationsmodeln till min DDD, även om jag inte tycker att det är helt korrekt, så känns det ändå bättre än att ha en massa logik i mina ViewModel klasser, de skall vara så nätta som möjligt och bara innehålla logik för att visa infomation inte för att spara/hämta data...

- M

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
134 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)