WPF + MVVM + DI (C#) - Best Practicies

gost 390446

Iskusan
Poruka
5.726
U poslednjih nekoliko nedelja, dobijao sam zadatke da refaktorisem neke kodove pisane pre 2-3 godine. U pitanju su bile klijent-server aplikacije, gde su klijenti bili single-page WPF aplikacije. I toliko djubreta od koda sam pretresao da sam poceo da sanjam nocu svakakve gluposti :D

Takodje, vidim da i ovde dosta ljudi uopste nije shvatilo dva osnovna principa OOP-a, i uporno pokusava da tera po svom, a onda kukaju kada nesto ne moze lepo da se implementira.

Ta dva motiva, a i trenutan visak vremena na poslu (nisam lud da im kazem da sam zavrsio sve za ovaj sprint dva dana ranije :D) me motivisu da otvorim temu, gde bih objasnio kako implementirati jednu jednostavnu desktop aplikaciju, koriscenjem WPF-a, ali tako da ispostujemo MVVM pattern, i da iskoristimo moc Depencency Injection-a.

Pre nego krenemo, da ponovim dva osnovna principa OOP-a (poznati kao osnovni principi solid programming-a): JAKA KOHEZIJA, i SLABA POVEZANOST (High Cohesion & Low Coupling).

Jaka kohezija podrazumeva da je jedan objekat odgovoran za jedan posao. Kao i u stvarnom svetu, recimo, automobil ima vise delova, i svaki deo je odgovoran za jedan posao koji radi.
Slaba povezanost, izmedju delova, podrazumeva da delovi treba da sto je manje moguce zavise jedni od drugih - kako bi lakse mogli da se zamene, unaprede, odrzavaju, popravljaju, da se lako detektuje u kom delu je problem.

Da bi se ispostovala ova prica u programiranju, osmisljen je MVVM dizajn pattern. Naravno, postoji jos mnogo drugih pattern-a, i svi su tu sa ciljem da ispostuju solid-programming-principles, ali ovde cemo da se zadrzimo, i prikazemo kako radi MVVM.

Prvo slovo M u skracenici je od MODEL - predstavlja model podataka, tacnije predstavlja nase podatke.
Drugo slovo V, je od VIEW - predstavlja user interface - prikaz nasih podataka.
poslednja dva slova su od VIEW-MODEL: medjusloja, koji predstavlja "lepak" izmedju modela i view-a, i sluzi da poveze nase podatke sa interfejsom, ali i mnogo vise: sluzi kao neka vrsta "skretnicara", "dispecera", tacnije onoga koji povezuje ne samo prikaz podataka i ono sto nase podatke sadrzi, vec uz pomoc jednog drugog, dodatnog, jako bitnog mehanizma u celoj ovoj prici, povezuje i prosledjuje ko ce i kako izvrsavati akcije nad tim podacima (komande). Taj dodatni mehanizam se zove Depencency Injection, i o njemu cemo malo kasnije, kroz konkretan primer.
Dakle, da rezimiramo:
MODEL - sadrzi podatke.
VIEW - prikazuje podatke korisniku - UI
VIEW-MODEL - povezuje ova dva, i ponasa se kao vrhovni komandant, koji odredjuje ko ce koje komande da izvrsi.

mvvm-schema.jpg


Mozemo li sada dalje, da polako krenemo sa konkretnim primerom, i da vidimo kako ovo radi? Jel ovo interesuje nekoga, uopste? :D
 
Poslednja izmena:
Update-ovano, skinite ponovo, dodat je model, uvazena sugestija :)

U ovom konkretnom slucaju, mnogo je vaznije objasniti funkciju Provider-a, ViewModel-a, i Dependency kontejnera, kako bi se shvatilo kako se sve to lepo povezuje i izvrsava.
Ocekujem sada pitanja o svemu ovome......
Skinite solution, otvorite u VS 2015, ili novijem (moze i besplatna, community verzija), kompajlirajte, pogledajte kod, pa hajde da diskutujemo :)
 
Poslednja izmena:
Pozdrav :)
Želela bih da skinem projekat, ali nije više dostupan, bila bih vam jako zahvalna ako možete ponovo da postavite rešenje kako bih mogla da proučim pa onda da "navalim" sa pitanjima :)

Trenutno radim diplomski, tema je: "Projektovanje i implementacija WPF aplikacije za bioskope", u C#.
E sada, naletela sam na problem, pored lenjosti, koja me je dovela do toga da imam još jako malo vremena da završim implementaciju koda i neophodna mi je pomoć nekoga ko se razume u WPF da mi objasni na šta da se skoncentrišem, odakle uopšte da krenem (pre 3 godine sam dala sve ispite i naravno da je mnogo toga zaboravljeno do sada), kao i gde da tražim materijale koji mi mogu biti od pomoći. Provodim dane tražeći po internetu i sve vise sam sluđena, nikako da nađem nešto konkretno.

Da pređem na stvar: U pitanju je desktop aplikacija za radnika na šalteru u bioskopu koji ima mogućnosti da upravlja filmovima i projekcijama. Radnici mogu imati ulogu administratora i šalterskog službenika, što znači da je potrebno uvesti neki vid kontrole pristupa. Aplikacija je prilično jednostavna - obe role imaju potpuno odvojene zadatke, npr. Admin može da unosi nove filmove i projekcije u bazu, menja podatke o njima, da uklanja pojedinačne projekcije kao i da ukloni ceo film sa repertoara, dok šalterski službenik ima mogućnost pretrage filmova i projekcija, i rad sa kartama, gde može da kreira novu kartu, vrši pretragu karata i stornira određenu kartu.

Biću vam najzahvalnija na svetu ako možete da mi objasnite koji je najbolji i najlakši način da rešim deo oko logovanja korisnika i kontrole pristupa. Taj deo mi predstavlja problem jer se prvi put susrećem sa više rola u WPF-u. Profesorka mi je rekla da mogu da koristim MVVM ali to je već moj izbor ako želim da se malo više pozabavim time i da je sve to moguće rešiti preko baze podataka. Takođe akcenat rada je više na razvoju softvera (Larmanov metod), a implementacija koda treba da bude što jednostavnija.

Svaka ideja, kritika, sugestija je i više nego dobrodošla :) I nadam se da nisam promašila temu, tražim pomoć ali takođe bih volela i da naučim nešto novo i korisno :)
 

Back
Top