Správičky 2 794 Blogy 945 Fórum 18 460

Prehľad diskusie

photo
[MVC] - poslat do podkomponenty IDcko alebo model?
liero
9. 8. 2017 9:40:26
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
10. 8. 2017 7:34:12
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
xxxmatko
10. 8. 2017 9:21:50
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
liero
10. 8. 2017 10:36:14
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
xxxmatko
10. 8. 2017 13:18:52
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
harrison314
10. 8. 2017 14:20:30
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
Liero
10. 8. 2017 15:28:57
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
11. 8. 2017 23:03:09
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
11. 8. 2017 23:27:42
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
12. 8. 2017 22:05:37
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
liero
13. 8. 2017 18:31:23
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
14. 8. 2017 3:37:35
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
liero
14. 8. 2017 8:11:54
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
14. 8. 2017 23:01:15
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
liero
15. 8. 2017 7:11:36
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
17. 8. 2017 22:55:58
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
liero
18. 8. 2017 9:50:32
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
19. 8. 2017 11:22:13
photo
RE: [MVC] - poslat do podkomponenty IDcko alebo model?
T
19. 8. 2017 11:30:59

[MVC] - poslat do podkomponenty IDcko alebo model?

photo
liero
9. 8. 2017 9:40:26
Body: 9185
Najaktívnejší č.: 6

[MVC] - poslat do podkomponenty IDcko alebo model?

Pod podkomponentou rozumej TagHelper, alebo ViewComponent, alebo PartialView.

Ide o novy portal vyvojari.sk (ano, ked si najdem cas, nieco kodim, dufam ze mi niekto pomoze s frontendom).

Osvedcil sa mi taky best practice, ze vsetky data si natiahnem v Controlleri, ktore potom cez viewmodel pretlacim do View a vsetkych podkomponentov. Samotne komponenty si uz ziadne data netahaju, vsetko by mali dostat na vstupe.

Znie to super, zjednodusuje sa tym debugovanie aj optimalizacia queries, vsetko ma svoje miesto.

Ked ale zobrazujem zoznam prispevkov, resp komentarov, mam takyto nejaky model:

class Item {
   public string CreatedBy {get; set;} //username
}

Chcem si vyrobit komponentu, ktora bude zobrazovat fotku, pripadne nejake dalsie info o uzivatelovi. Predpokladam, ze tieto data budu v nejakej cache. Databazu uzivatelov mam totiz v inej databaze a niesom si este isty, ci to mergnem.

A moja dilema znie: Mala by komponenta, ktora zobrazuje fotku+nejake dalsie info o uzivatelovi dostat na vstupe iba UserName s tym ze potrebne data si dotiahne z cache, alebo trvat na tom, ze vsetko sa dotiahne v controlleri? tym padom by som na celom webe musel nahradit class Item

class ItemViewModel {
   public Item Item {get; set;}
   public UserInfo CreatedBy {get; set;}
} 

Co je teda dost neprakticke, hlavne pri zlozitejsom objektovom grafe typu Question->Answers->Comments->Edits.....

 

[Reakcia]

photo
T
10. 8. 2017 7:34:12
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

ahoj, toto si zasluzi dlhsiu odpoved. Nie, zodpovednostou C je reagovat na user input(command), nie queryovat. Ten pattern, ktory mas v hlave je kombinaciou toho, ako bol vymysleny model2 a zaroven ako vymysleny nebol...kompozitny layout. Tahanie dat pre cely kompozitny layout v jednom controllery je workaround. View component bol vymysleny, aby trochu patchoval z vyssie uvedenych skutocbosti vyplyvajuce problemy https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components

vsimni si najma zmienku o biz logike...je uplne ok, ak si view component sam taha data, a obecne je uplne ok, asi si view(ano view) riesi queryovanie, je uplne ok, ak sa sklada z view z komponentov, ktore si autonomne queryuju...btw. ten async invoke je tam presne kvoly tomu

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
xxxmatko
10. 8. 2017 9:21:50
Body: 4440
Najaktívnejší č.: 10

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

Nevidim problem v tom aby si jednotlive komponenty dotahovali to co potrebuju same. ano nejaky vstup potrebuju (napr. ako pises username) ale zvysok nech si dotiahne sam. cielom je aby bol komponent co nezavisly. ak si podatahujes vsetko v controlleri a tak nakoniec skoncis s tym, ze controller bude tahat vsetko, a vo viewe budes preposielat hotove data podkomponentom, potom uz ale podkomponent nebude ani komponent ale len "zobrazovatko". myslim ze nasledne by to bolo aj tazsie udrziavatelne, bo akakolvek zmena v controlleri (v dotahovani dat) by mohla viest k tomu ze musis menit viewmodel, musis menit komponenty atd.

xxxmatko

[Reakcia]

photo
liero
10. 8. 2017 10:36:14
Body: 9185
Najaktívnejší č.: 6

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

@xxxmato:

akakolvek zmena v controlleri (v dotahovani dat) by mohla viest k tomu ze musis menit viewmodel, musis menit komponenty 

tomu celkom nerozumiem. Ked sa zmeni komponent, tak sa pravdepodobne zmeni aj jeho viewmodel a je jedno, ci si ho "vyrobi" sam, alebo ho dostane ako parameter. Riziko vidim skor v tom, ze ak sa zmeni viewmodel komponenty, tak musim tuto zmenu reflektovat v kazdom controlleri.

Na druhej strane, ak si kazdy komponent taha data sam, moze to viest k n DB dotazom namiesto jedneho v controlleri.

 

 

[Reakcia]

photo
xxxmatko
10. 8. 2017 13:18:52
Body: 4440
Najaktívnejší č.: 10

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

No ja som to myslel tak, ze povedzme nieco zmenis v controlleri lebo to potrebujes zmenen posielat do podkomponentu A, a moze ti to ovplyvnit aj podkomponent B (ak si nepreposielas len jednoduche parametre)

hej, tych dopytov do DB mozes mat potom zase vela namiesto jedneho, mozes mat aj viac co budu tahat podobne veci atd. ale to uz asi zavisi aj od toho ako si to kto ohne/priohne.

bo moj nazor je aj taky, ze napriek tomu ze v .NETe mam MVC, co je nejaky vzor atd, to neznamena ze vsetci teraz budu vyrabat aplikacie "spravne".

 

xxxmatko

[Reakcia]

photo
harrison314
10. 8. 2017 14:20:30
Body: 970
Najaktívnejší č.: 24

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

myslim, ze si v tomto az prilis puristicky.

Ak pouzivas ViewComponenty len na zobrazovanie dat, ktore nacita kontroler, tak ho degradujes na parcialny pohlad. No beriem to tak, ze sa to z hladicka vykonu, plus nejakych inych veci prosto hodi. Ja ich pouzivam rovnako, hlavne na obskurne rekurzivne zobrazenia, ktore este parsuju daco navyse.

Druhy pohlad, je ked das ViewComponentu iba ID-cko, co sa hodi na samostatne casti.

napriklad zobrazujes v blogu clanok - pride ti ID-cko a v kontroleri nacitas vsteko co suvisi zo samotnym clankom. Ak nastane chyba osetris ju alebo hodis 404.

V pohlade zobrazis text clanku. Ale napriklad informacie o autorovi mozes  dat kludne do viewComponentu, ktory pouziva iba ID, pretoze si to vies nacachovat, a pravdpodobne ho pouzijes aj niekde inde.

No pri komentaroch to moze byt uz na uvazenie, za istych okolnosti je ich vhodne nacitavat spolu s clankom, inokedy samotatne a niekedy dokonca ajaxom...

Prosto nebol by som tak striktny, ale tieto typy ViewComponentov by som rozdelil nejakou mennou konvenciou aby v tom bol poriadok.

[Reakcia]

photo
Liero
10. 8. 2017 15:28:57
Body: 9185
Najaktívnejší č.: 6

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

Ak pouzivas ViewComponenty len na zobrazovanie dat, ktore nacita kontroler, tak ho degradujes na parcialny pohlad. No beriem to tak, ze sa to z hladicka vykonu, plus nejakych inych veci prosto hodi. Ja ich pouzivam rovnako, hlavne na obskurne rekurzivne zobrazenia, ktore este parsuju daco navyse

Nuz ale preco potom pouzivat ViewComponent a nie len PartialView, resp TagHelper ktory renderuje PartialView ak potrebujes "nejake parsovanie navyse"?

Zacinam sa priklanat k tomu, ze ViewComponent treba pouzit vtedy, ked je za tym nejaka business logika, pripadne dotahovanie udajov, cize to, co naznacil @T. Koniec koncov, ViewComponent je nahrada za Html.Action, resp "partial action". V takom pripade nepotrebujes "rozdelit ViewComponenty nejakou mennou konvenciou aby v tom bol poriadok."

 

[Reakcia]

photo
T
11. 8. 2017 23:03:09
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

@liero:
"Na druhej strane, ak si kazdy komponent taha data sam, moze to viest k n DB dotazom namiesto jedneho v controlleri."

to je dan za loosely coupling a chcel by som vidiet ci pouzivas deffered queries ak toto povazujes za taky velky problem, kedze zrejme pouzivas ORM.

"Ked sa zmeni komponent, tak sa pravdepodobne zmeni aj jeho viewmodel"
component ma/moze mat svoj view model a specialne pri queries je viewmodel absolutne nepodstatny, potrebujes zobrat vysledok query a zobrazit ho. Navyse vacsina rozumnych grid controllov funguje autonomne napr. nad iqueryable a ma svoj "embedded controller" ktory to riadi server alebo client side(cez rest) a takto je to spravne.

Z pohladu CQRS - controller riesi commandy, view si queryuje.

..... obsirnejsie

Pozri si oreginal MVC pattern obrazok
https://www.ibm.com/developerworks/rational/tutorials/ar-designpat2/fig06.jpg

a zamysli sa, ako su nakreslene sipky a zistis, ze babranie sa s queries v controlleri je v rozpore s paternom, ze controller nema co tlacit udaje do view a bol to taky jednoduchy kompromis/workaround pre weby s jednoduchou zobrazovacou logikou a interakciou, kde bol problem zabezpecit notifikovanie view o zmene v domain modely.

To preco viewcomponenty navyse "smrdia" je celkovy design model2 MVC a primitivny lifecycle view , kde componenty realne nedokazu komunikovat medzi sebou, lebo ich instancie "neziju" sucastne v nejakej control structure, oni sa len sekvencne renderuju (a nic na tom nemeni ani async invoke pri viewcomponente)

Samozrejme, ze sa da aj toto obicyklovat, ale to by uz bola tvorba noveho fmwk.  

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
T
11. 8. 2017 23:27:42
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

@liero:

inak o o tej biz logike som nepovedal ja, ale MS. Je to hlupost, lebo medzi spustenim query a zobrazenim jej vysledku ziadna biznis logika nie je a nema ako byt :-) Vsetky sample co som videl okolo viewcomponenty navyse boli naozaj o queryovani...a to nie je nahoda.

v podstate tam malo byt napisane, ze ....viewcomponet si moze autonomne queryovat a riesit zobrazovanie nezavisle od controlleru (ktory obsluhuje master view a podla patternu do neho tlaci udaje)...to je to, na co bol vymysleny resp. na toto je dobry tak, ako bol vymysleny. A to je to na co sa pytas.

a celom kontexte "Can have parameters and business logic" ... no, hrame sa tu na M-VC...a do V nas MS smeruje umiestnit nejaku biznis logiku....vazne? takze popiera najdolezitejsiu pointu MVC....oddelenie prezentacnej a aplikacnej logiky... a vznika novy pattern M-V(B)-C (B ako bordel)

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
T
12. 8. 2017 22:05:37
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

posledna myslienka:

Majme stranku, ktora zobrazuje zoznam userov, majme nejake moznosti filtrovania a strankovania a majme hlupy grid resp.  zobrazenie userov si riesime sami. Otazka znie, je lepsie/cistejsie queryovat v controllery alebo z view?

OK, 99,9% sampleov to bude riesit v controlleri. ViewModel bude riesit jednak logiku filtrov a strankovania a rovnako aj queryovat. Aj z hladiska SRP by nam mal zasvietit majak.

Ovela cistejsie je, ked viewmodel bude naozaj obsahovat len stav a to su filtre, aktualna strana a logiku okolo ovladania filtra a strankovania bude riesit controller, nic viac. Budeme mat krasny a cisty ViewModel. Controller bude riesit len to, co sa bezne popisuje ako jeho zodpovednost. Queryovat bude priamo view na zaklade stavu vo ViewModely, ktory do neho moze tlacit Controller. (tak je vymysleny framework, netreba observer a je to ok vzhladom na charakter/bestavovosti HTTP). Domenovy model tiez nepotrebuje notifikovat o zmenach v domain modely aby sa refreshol ako pri klasickom MVC, my vieme, ze chceme aktualizovat view vzdy(lebo HTTP), ked pride request na server, takze tento problem nam odpada. Okrem samotneho zoznamu userov priamo vo view nacitame a zobrazime samozrejme aj celkovy pocet stranok (ktore nam vracia jedna metoda query fasady, alebo ktory vyriesime nad jednym IQueryable). Testovatelnost? Query fasadu = integracny test si viem otestovat, View Model/Controller spravanie si viem otestovat bez toho, aby som musel tieto dve veci nezmyselne spajat a bud obe riesit ako integracny test alebo sa umelo trapit mockovanim alebo stubmi, ktore len prinasaju zbytocnu komplexitu a testuju to, co som si tam naviac zaniesol.

Recnicka....preco by som to takto old schoolovo nemohol robit by default? Navyse, ked mi do toho hraju uz aj ViewComponenty? Lebo 99,9% blogov to riesi inak?

 

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
liero
13. 8. 2017 18:31:23
Body: 9185
Najaktívnejší č.: 6

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

no ja to myslim robim takto oldschoolovo by default, az nato, ze view by default nenechavam queryovat. To si viem prestavit iba v takych scenaroch, ako je nejaky DataGrid, ktory spominas, pripadne pagination a podobne, kde si to riesi nejaky component. Ale dnes by som uz DataGrid asi sotva riesil v MVC nejakym server renderom. Vo WebForms prosim, v MVC by sa mi s tym babrat nechcelo.

Ale v tomto pripade som mal na mysli nieco prostejsie - controller dostane ako parameter nejake IDcko (diskusie) a potrebuje si dotiahnut vsetky data - otazku, komentare, odpovede, ku kazdej odpovedi info o uzivatelovi.

[Reakcia]

photo
T
14. 8. 2017 3:37:35
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

@liero:

Ten grid som vybral, lebo je reprezentativny a lahko pochopitelny a je s nim spojena urcita komplexnost.(btw. v rovnakom zmysle sa mozem opytat, ze kto by dnes riesit cokolvek server side renderom, ked uz gridy riesi len ajaxom :-))

spat k teme a k Tvojmu prikladu:
Controller rozhodne, ktore view sa maju zobrazit na zaklade obsluhy user commandov(to je stale este zo starych definicii), v pripade asp.net mvc parametrizuje tieto views (natlaci do nich stav, nic ine sa v tomto frameworku neda robit bez revolucie) a vsetky views si zabezpecia dotiahnutie toho, co potrebuju autonomne. Hierarchia moze existovat aj pri views, na child views mozes/mas pouzit presne ViewComponent na ktory si sa pytal. Kedze budu autonomne, mozu bezat asynchronne.

Diskusia(View) -> DiskusieQueryModel.ZiskatDetailDiskusie(id)
----Komentare(ViewComponent) -> DiskusieQueryModel.ZiskatKomentare(id), ktora obsahuje rovno aj info o userovi. db joiny snad ovladame...

neviem aky je rozdiel medzi komentarom a odpovedou...resp. aky model mas vymysleny...ale nech by bol akykolvek nic by to na tomto nezmenilo...

Btw. 1 Dikusia je na prvy pohlad aggragat a komentare jeho sucastou, cize nevidim dovod, preco to netahat ako jeden celok a da sa to aj z relacnej databazy...napr. as XML, JSON alebo nejaka forma struktury ak ju databaza podporuje, samozrejme ak nemam rad SQL tak to mozem riesit aj Linqom. Vratim si co potrebujem na jedno volanie ako objektovy graf a zase len zobrazim.

Btw. 2 Inak netvrdim, ze tym queryovanim z view sa vsetky choroby asp.net mvc vyriesia.

Btw. 3 skusim aj ja otazku. Mam master page. V nej mam header a footer, kde zobrazujem informaciu o aktualnom pouzivatelovi, nejake 2-3 statisticke udaje, pocet novych sprav etc.  Ako to budes riesit v asp.net mvc?(ajax bokom) Urobis si bazovy ViewModel a na zaciatku vo volani controller metody tam tie udaje natlacis?   

  

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
liero
14. 8. 2017 8:11:54
Body: 9185
Najaktívnejší č.: 6

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

RE: Mam master page. V nej mam header a footer, kde zobrazujem informaciu o aktualnom pouzivatelovi, nejake 2-3 statisticke udaje, pocet novych sprav etc.  Ako to budes riesit v asp.net mvc?

Natlacim to vsetko do session a tahat to budem odtial :) [Joke]

 

[Reakcia]

photo
T
14. 8. 2017 23:01:15
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

@liero: ked to zoberiem trochu vazne, tak je to de facto nejake in memory uloziko, ktore queryujes(key value in memory db)...cize tu to prirodzene urobi vacsina ludi a nevadi to ;-) 

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
liero
15. 8. 2017 7:11:36
Body: 9185
Najaktívnejší č.: 6

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

No, ale seriozna odpoved by bola, ze na masterpage dam ViewComponent. V minulosti Partial View/Action

[Reakcia]

photo
T
17. 8. 2017 22:55:58
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

@liero: bola, pokym aj napises, ako sa do nich dostanu query data :-) a zase ked to mas v layoute/masterpage, naco to zbytocne encapsulovat ak nie je dovod?

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
liero
18. 8. 2017 9:50:32
Body: 9185
Najaktívnejší č.: 6

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

dajme tomu ze chcem zobrazit na masterpage info o aktualnom uzivatelovi, tak poslem do viewcomponenty username a ta si urobi svoje queries.

Pripadne chcem zobrazit panel s najaktivnejsimi uzivatelmi.

Robit nejake dotazy na DB vo view, to mi je proti srsti. View ma zobrazovat, nie queryovat.

[Reakcia]

photo
T
19. 8. 2017 11:22:13
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

@liero:

1. presne tak (ten zaciatok)

2. "View ma zobrazovat, nie queryovat"


a) v jednotke si to veselo urobil (view component je cast view)

b) kto toto zadefinoval? lebo prave opak je pravdou, (z definicie to vyplyva len ak povies, ze view je pasivny, ale preco by musel byt, ked vidime, ze nam to komplikuje zivot?)

c) view ma obrazovat....super...ale MUSI zobrat odniekial udaje(z modelu) a zobrazit ich....musi o ne poziadat nejaky komponent, musi sa dotazat na tieto udaje. Rozdiel je potom len vo forme ako to robi, nie vo fakte, ze to musi robit.

d) z hladiska tradicnej definicie MVC opak je pravdou, ako si napisal
tu je krasne zachyteny v obrazkoch vyvoj patternu a odvodene varianty najdes popisane aj u fowlera (vidis aka je velka variablita tohoto patternu a ze si ho mas prisposobit zdravemu rozumu), cize ak Ti chyba "dokaz", tak paci:
http://pl.csie.ntut.edu.tw/~ctchen/pdf/InsideSmalltalkMVC-public.pdf

e) proti srsti - skus argumentovat, vecne, preco proti srsti? Musi vzniknut nejaky hype okolo toho, ze aj  takto je to "spravne", aby si to akceptoval? Ked je ok queryovat z view napr. view model, ked je ok queryovat in memory storage, preco by nemohlo byt v poriadku queryovanie domain modelu? Aky princip je poruseny? MVC rozhodne nie, SRP nie. Aky negativny dopad to ma udrzatelnost a testovatelnost? (ja som napisal argumenty v prospech oboch oblasti)

f) smrtelo by Ti menej, keby si tie query metody mal owrapovane vo view modely? Lebo aj to je moznost a tiez dobra (obkecavat to nebudem, len info aj o takejto moznosti), ja preferujem priame queryovanie udajeov domain modelu z view

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
T
19. 8. 2017 11:30:59
Body: 21285
Najaktívnejší č.: 2

RE: [MVC] - poslat do podkomponenty IDcko alebo model?

a este, ako aspirant na znalca CQRS ....skus sa zamysliet, ako to MVC zapada k tomuto konceptu....controller => riesi handlovanie commandov a riadi aktualizaciu stavu v reakcii na command....cize prirozdene ma vztah ku write/state modelu
view zobrazuje stav, je prirodzene, ze sa obracia na read/query model, pretoze tam ma udaje pripravene priamo na zobrazenie (co v najjednoduchsej realizacii zodpoveda napr. view vrstve v relacnej db)

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]



Najaktívnejší užívatelia
1. 37750 b. photo vlko
2. 21285 b. photo T
3. 15955 b. photo spigi
4. 15450 b. photo Anonymous
5. 11110 b. photo dudok
6. 9185 b. photo Liero
7. 6885 b. photo siro
8. 6245 b. photo slavof
9. 5355 b. photo duracellko
10. 4440 b. photo xxxmatko