SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
ASP.NET MVC - BAD PRACTICES


                               Radu Vunvulea
                    vunvulearadu.blogspot.com
Radu Vunvulea
Mail: vunvulear@gmail.com
Blog: vunvulearadu.blogspot.com/
Agenda
•   ASP.NET MVC Introduction
•   Why “BAD PRACTICES”
•   Some bad practices
•   More bad practices
•   And more bad practices
•   Q&A
•   Bibliography
MVC - Model View Controller


             Model




Controller           View
De ce “BAD PRACTICES”?
De ce “BAD PRACTICES”?




           2 km
De ce “BAD PRACTICES”?




           20 km
De ce “BAD PRACTICES”?




           900 km
View Model = Domain model




Repository          View

       Domain Model
View Model = Domain model

•   In view o sa ajunga mai multe date decat este necesar
•   Entitatea o sa fie poluata cu diferite atribute ce tin de UI
•   Nu exista o separare clara a fiecarui layer

•   Modelul este un DTO (Data Transfer Object) si ar putea sa fie
    compus doar din string-uri

•   Un convertor se poate folosi pentru a obtine un model dintr-o
    entitate (intr-un sens, in doua sensuri)
•   Un framework pentru maparea entitatilor (AutoMapper)

•   Codul care face conversia nu se duplica
•   Controller-ul nu creste ca si complexitate din cauza conversiei
View Model = Domain model
View-ul contine logica
View-ul contine logica

•   In view modelul este procesat
•   Modelul nu contine date in stare finala

•   View-ul ar trebui doar sa afiseze modelul
•   Logica de procesare nu are ce cauta in view

•   Din view nu se apeleaza clase exterioare
•   Un view poate sa contina IF si FOR (FOREACH)
•   SWITCH – chiar avem nevoie de el?
•   Daca populam modelul corect, IF-ul poate sa fie inlocuit cu un
    HtmlHelper
Controller si dependintele exterioare
Controller si dependintele exterioare

•   Controller-ul nu ar trebui sa acceseze direct HttpContext, baza de
    date sau orice alta resursa
•   Setarile din web.config nu trebuie accesate direct

•   Este mai greu de testat
•   Nu este flexibil
•   Orice schimbare poate sa genereze foarte multe modificari

•   Se poate construi un wrapper peste aceste dependinte
•   Wrapperul poate sa grupeze datele din punct de vedere logic si nu in
    functie de sursa lor
•   ActionFilter care sa ne ofere aceste date
Controller si dependintele exterioare
Controller si dependintele exterioare
Nu folositi “magic words”
Nu folositi “magic words”

•   Cand se acceseaza sesiunea, ViewData, ViewBag, etc
•   Pot sa apara foarte usor greseli de scriere (misspelling)
•   Duplicarea informatiei – aceiasi informatie in mai multe locuri
•   Aceiasi conversie de date se face in mai multe locuri

•   Nu o sa stiti cauza pentru care view-ul crapa (misspelling sau datele
    nu au fost puse unde trebuie)

•   Wrapper
•   Extension methods
•   Datele de care avem nevoie in view se pot trimite prin model si nu
    prin alte mecanisme
Nu folositi “magic words”
Nu hardcodati RouteUrl-urile

•   Evitati sa folosti Html.ActionLink in view
•   Evitati sa folosti RedirectToAction in controller

•   Puteti crea extension methods pentru fiecare url
•   Le puteti refolosi in mai multe locatii (atat in view cat si in controller)
•   Creati extension methods si pentru locatiile la resurse (image
    path, JavaScript path, CSS files path)
Repopulare date comune in Model

• 2 sau mai multe modele contin aceleasi date

• Creati o structura de clase
  (BaseUserModel, CustomerUserModel, AdminUserModel)
• Populati modelul de baza dintr-un singur loc
Repopulare date comune in Model

• 2 sau mai multe modele contin aceleasi date

• Creati o structura de clase (BaseUserModel, CustomerUserModel,
  AdminUserModel)
• Populati modelul de baza dintr-un singur loc




                                            ?
Agregare date pentru o actiune

• Daca avem nevoie de acelasi ActionFilter in mai multe actiuni, atunci
  incercati sa le puneti intr-un sigur loc (intr-un BaseController)
• Folositi ActionFilter pentru a transforma datele care vin din diferite
  locatii in parametri pentru actiune
Fat Controller

•   Apeleaza direct baza de date
•   Proceseaza informatia
•   Logica din el este foarte complexa – toata partea fun este in controller
•   Are foarte multe actiuni
•   Multe entitati sunt cuplate prin intermediul controller-ului

• Greu de inteles, modificat si testat
• Controller-ul nu trebuie sa fie strans legat de domeniu
• Nu el trebuie sa fie dirijorul aplicatiei noastre

• Un controller per functionalitate si nu per entitate
Fat Controller

• Un controller per functionalitate si nu per entitate




• Fiecare functionalitate care este oferita de catre aplicatia noastra
  poate sa fie reprezentata de catre un controller
• Un controller per use case – nu este mereu posibil
Actiunile apelate des nu sunt cache-uite

• Daca avem actiuni care sunt apelate des, iar continutul ramane la
  fel, atunci putem sa folosim OutputCache

• Nu poluati controller-ul cu configurarea cache-ului
• Cache-ul trebuie configurat din web.config si nu din controller
Framework-ul de DI este apelat direct

• In anumite factory-uri (ControllerFactory) se apeleaza direct clase care
  tin de framework-ul de DI
• Diferite proiecte folosesc diferite DI

• Creati un wrapper peste acestea, care sa abstractizeze API-ul
• Folositi Common Service Locator
   • Este o abstractizare peste mecanismul de DI, care iti permite sa
      folosesti acelasi API indiferent de ce framework de DI folosesti
HtmlHelper - overused

• Nu creati un extension method la un HtmlHelper daca nu este folosit
  cel putin in doua locuri
• Incercati sa grupati aceste metode sub un nod comun daca se poate
   • O sa fie mai usor de folosit si de inteles

    HtmlHelper
       .Table()
       .BoxList()
       .Pivot
       .Product()         – returneaza ProductHtmlHelper
                 .FormatPrice()
                 .Stock()
                 …
       …
JavaScript in View

• Oricat de scurt este JavaScript-ul nu il puneti in view
• JavaScript-ul o sa polueze view-ul si o sa il faca greu de inteles
• Nu faceti apeluri AJAX din View

• Nu hardcodati adresa url pentru AJAX in JS – use UrlHelper
   • Ce se intampla daca o actiune se redenumeste ?
   • Ce se intampla daca locatia unei resurse se schimba?

    • Trebuie facute in mai multe locuri modificari
View-uri foarte lungi

• Cat de normal este sa ai un view de 100 de randuri, iar codul sa se
  repete?
• Cat de normal este ca intr-un FOR dintr-un view sa se afiseze contintul
  unui “sub-model” direct?

• Pentru aceste cazuri se poate folosi Partial View
• Nu conteaza daca acesta are doar 2 randuri sau 10
   • Reutilizarea codului creste
   • Devine mai clar
   • Mai usor de citit si testat
Q&A
vunvulear@gmail.com
vunvulearadu.blogspot.com/

Weitere ähnliche Inhalte

Andere mochten auch

Direito administrativo
Direito administrativoDireito administrativo
Direito administrativoAdauto Lacerda
 
Letter of Recommendation_Celeste
Letter of Recommendation_CelesteLetter of Recommendation_Celeste
Letter of Recommendation_CelesteMaribel Valentin
 
scan (dragged)
scan (dragged)scan (dragged)
scan (dragged)Joe Mearns
 
план розвитку біленченківської зош і іі ступенів
план розвитку біленченківської зош і   іі ступенівплан розвитку біленченківської зош і   іі ступенів
план розвитку біленченківської зош і іі ступенівTamara Emec
 
ciudad, cultura y acciones colectivas
ciudad, cultura y acciones colectivasciudad, cultura y acciones colectivas
ciudad, cultura y acciones colectivasgeorge_castro
 
Arquitectura del computador rulfix
Arquitectura del computador rulfixArquitectura del computador rulfix
Arquitectura del computador rulfixrulfur
 
презентация зно
презентация знопрезентация зно
презентация зноTamara Emec
 
Sneak preview ames occasioncentrum
Sneak preview ames occasioncentrumSneak preview ames occasioncentrum
Sneak preview ames occasioncentrumLeadrs
 
Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...
Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...
Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...Ten Bos
 
Historia de la ruleta
Historia de la ruletaHistoria de la ruleta
Historia de la ruletaJuanse1203
 
Demetrio Zárate Rivera
Demetrio Zárate RiveraDemetrio Zárate Rivera
Demetrio Zárate Riveradezarito
 
17287522 Espiritismo Infantil Historia 51
17287522 Espiritismo Infantil Historia 5117287522 Espiritismo Infantil Historia 51
17287522 Espiritismo Infantil Historia 51Ana Cristina Freitas
 
Caceres Del Tresorlleida
Caceres Del TresorlleidaCaceres Del Tresorlleida
Caceres Del TresorlleidaIsabel Marco
 
Gunite Certificate Auto Slack
Gunite Certificate Auto SlackGunite Certificate Auto Slack
Gunite Certificate Auto SlackDuane Waterman
 

Andere mochten auch (20)

Direito administrativo
Direito administrativoDireito administrativo
Direito administrativo
 
Letter of Recommendation_Celeste
Letter of Recommendation_CelesteLetter of Recommendation_Celeste
Letter of Recommendation_Celeste
 
scan (dragged)
scan (dragged)scan (dragged)
scan (dragged)
 
Planificador
Planificador Planificador
Planificador
 
план розвитку біленченківської зош і іі ступенів
план розвитку біленченківської зош і   іі ступенівплан розвитку біленченківської зош і   іі ступенів
план розвитку біленченківської зош і іі ступенів
 
ciudad, cultura y acciones colectivas
ciudad, cultura y acciones colectivasciudad, cultura y acciones colectivas
ciudad, cultura y acciones colectivas
 
Arquitectura del computador rulfix
Arquitectura del computador rulfixArquitectura del computador rulfix
Arquitectura del computador rulfix
 
Robotica
RoboticaRobotica
Robotica
 
презентация зно
презентация знопрезентация зно
презентация зно
 
Sneak preview ames occasioncentrum
Sneak preview ames occasioncentrumSneak preview ames occasioncentrum
Sneak preview ames occasioncentrum
 
Bsc. Statment
Bsc. StatmentBsc. Statment
Bsc. Statment
 
Tecnología!!!
Tecnología!!!Tecnología!!!
Tecnología!!!
 
Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...
Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...
Doe alle moeite om door de smalle deur naar binnen te gaan (21ste zondag door...
 
Urkunde Gridinsky
Urkunde GridinskyUrkunde Gridinsky
Urkunde Gridinsky
 
Historia de la ruleta
Historia de la ruletaHistoria de la ruleta
Historia de la ruleta
 
Demetrio Zárate Rivera
Demetrio Zárate RiveraDemetrio Zárate Rivera
Demetrio Zárate Rivera
 
17287522 Espiritismo Infantil Historia 51
17287522 Espiritismo Infantil Historia 5117287522 Espiritismo Infantil Historia 51
17287522 Espiritismo Infantil Historia 51
 
Caceres Del Tresorlleida
Caceres Del TresorlleidaCaceres Del Tresorlleida
Caceres Del Tresorlleida
 
Marketing Viral
Marketing ViralMarketing Viral
Marketing Viral
 
Gunite Certificate Auto Slack
Gunite Certificate Auto SlackGunite Certificate Auto Slack
Gunite Certificate Auto Slack
 

Ähnlich wie Asp.net mvc bad practices

Code Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru PhpCode Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru Phpioanaciprian
 
Programatica codepax-16-11-2012
Programatica codepax-16-11-2012Programatica codepax-16-11-2012
Programatica codepax-16-11-2012Agora Group
 
Drupal Global Training Days - 31 May 2014
Drupal Global Training Days  - 31 May 2014Drupal Global Training Days  - 31 May 2014
Drupal Global Training Days - 31 May 2014romancri
 
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...Codecamp Romania
 
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...Codecamp Romania
 
Ghid SEO Optimizare Site Web
Ghid SEO Optimizare Site WebGhid SEO Optimizare Site Web
Ghid SEO Optimizare Site WebFlavius Noja
 
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2Diana Tataran
 
Noutăţi în ASP.NET MVC 2
Noutăţi în ASP.NET MVC 2Noutăţi în ASP.NET MVC 2
Noutăţi în ASP.NET MVC 2Enea Gabriel
 
Content Management - Alexandru Lapusan
Content Management - Alexandru LapusanContent Management - Alexandru Lapusan
Content Management - Alexandru LapusanIDG Romania
 
Dezvoltare Web Folosind Java
Dezvoltare Web Folosind JavaDezvoltare Web Folosind Java
Dezvoltare Web Folosind Javacolaru
 
Sabloane de proiectare
Sabloane de proiectareSabloane de proiectare
Sabloane de proiectareAndrei Jechiu
 
Rute cu ASP.NET MVC
Rute cu ASP.NET MVCRute cu ASP.NET MVC
Rute cu ASP.NET MVCEnea Gabriel
 
Instalare si administrare site grid
Instalare si administrare site gridInstalare si administrare site grid
Instalare si administrare site gridalexstanciu
 

Ähnlich wie Asp.net mvc bad practices (20)

Code Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru PhpCode Igniter – Framework Web Rad Pentru Php
Code Igniter – Framework Web Rad Pentru Php
 
Programatica codepax-16-11-2012
Programatica codepax-16-11-2012Programatica codepax-16-11-2012
Programatica codepax-16-11-2012
 
Ruby EventMachine
Ruby EventMachineRuby EventMachine
Ruby EventMachine
 
Drupal Global Training Days - 31 May 2014
Drupal Global Training Days  - 31 May 2014Drupal Global Training Days  - 31 May 2014
Drupal Global Training Days - 31 May 2014
 
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...
Iasi code camp 20 april 2013 designing res tfull webservices and web apis - r...
 
Asp.Net Mvc
Asp.Net MvcAsp.Net Mvc
Asp.Net Mvc
 
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...
Remus Pereni - Remus Pereni - JavaScript, from dark ages to renaissance, the ...
 
Ghid SEO Optimizare Site Web
Ghid SEO Optimizare Site WebGhid SEO Optimizare Site Web
Ghid SEO Optimizare Site Web
 
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
[Web Days] Manipularea Datelor, Conectivitate Si Performanta In Silverlight 2
 
Noutăţi în ASP.NET MVC 2
Noutăţi în ASP.NET MVC 2Noutăţi în ASP.NET MVC 2
Noutăţi în ASP.NET MVC 2
 
Content Management - Alexandru Lapusan
Content Management - Alexandru LapusanContent Management - Alexandru Lapusan
Content Management - Alexandru Lapusan
 
Dezvoltare Web Folosind Java
Dezvoltare Web Folosind JavaDezvoltare Web Folosind Java
Dezvoltare Web Folosind Java
 
Prism
PrismPrism
Prism
 
Sabloane de proiectare
Sabloane de proiectareSabloane de proiectare
Sabloane de proiectare
 
Rute cu ASP.NET MVC
Rute cu ASP.NET MVCRute cu ASP.NET MVC
Rute cu ASP.NET MVC
 
Prezentare
PrezentarePrezentare
Prezentare
 
Webappdev
WebappdevWebappdev
Webappdev
 
Instalare si administrare site grid
Instalare si administrare site gridInstalare si administrare site grid
Instalare si administrare site grid
 
Webpack
Webpack Webpack
Webpack
 
Music Finder
Music FinderMusic Finder
Music Finder
 

Asp.net mvc bad practices

  • 1. ASP.NET MVC - BAD PRACTICES Radu Vunvulea vunvulearadu.blogspot.com
  • 3. Agenda • ASP.NET MVC Introduction • Why “BAD PRACTICES” • Some bad practices • More bad practices • And more bad practices • Q&A • Bibliography
  • 4. MVC - Model View Controller Model Controller View
  • 5. De ce “BAD PRACTICES”?
  • 6. De ce “BAD PRACTICES”? 2 km
  • 7. De ce “BAD PRACTICES”? 20 km
  • 8. De ce “BAD PRACTICES”? 900 km
  • 9. View Model = Domain model Repository View Domain Model
  • 10. View Model = Domain model • In view o sa ajunga mai multe date decat este necesar • Entitatea o sa fie poluata cu diferite atribute ce tin de UI • Nu exista o separare clara a fiecarui layer • Modelul este un DTO (Data Transfer Object) si ar putea sa fie compus doar din string-uri • Un convertor se poate folosi pentru a obtine un model dintr-o entitate (intr-un sens, in doua sensuri) • Un framework pentru maparea entitatilor (AutoMapper) • Codul care face conversia nu se duplica • Controller-ul nu creste ca si complexitate din cauza conversiei
  • 11. View Model = Domain model
  • 13. View-ul contine logica • In view modelul este procesat • Modelul nu contine date in stare finala • View-ul ar trebui doar sa afiseze modelul • Logica de procesare nu are ce cauta in view • Din view nu se apeleaza clase exterioare • Un view poate sa contina IF si FOR (FOREACH) • SWITCH – chiar avem nevoie de el? • Daca populam modelul corect, IF-ul poate sa fie inlocuit cu un HtmlHelper
  • 15. Controller si dependintele exterioare • Controller-ul nu ar trebui sa acceseze direct HttpContext, baza de date sau orice alta resursa • Setarile din web.config nu trebuie accesate direct • Este mai greu de testat • Nu este flexibil • Orice schimbare poate sa genereze foarte multe modificari • Se poate construi un wrapper peste aceste dependinte • Wrapperul poate sa grupeze datele din punct de vedere logic si nu in functie de sursa lor • ActionFilter care sa ne ofere aceste date
  • 19. Nu folositi “magic words” • Cand se acceseaza sesiunea, ViewData, ViewBag, etc • Pot sa apara foarte usor greseli de scriere (misspelling) • Duplicarea informatiei – aceiasi informatie in mai multe locuri • Aceiasi conversie de date se face in mai multe locuri • Nu o sa stiti cauza pentru care view-ul crapa (misspelling sau datele nu au fost puse unde trebuie) • Wrapper • Extension methods • Datele de care avem nevoie in view se pot trimite prin model si nu prin alte mecanisme
  • 21. Nu hardcodati RouteUrl-urile • Evitati sa folosti Html.ActionLink in view • Evitati sa folosti RedirectToAction in controller • Puteti crea extension methods pentru fiecare url • Le puteti refolosi in mai multe locatii (atat in view cat si in controller) • Creati extension methods si pentru locatiile la resurse (image path, JavaScript path, CSS files path)
  • 22. Repopulare date comune in Model • 2 sau mai multe modele contin aceleasi date • Creati o structura de clase (BaseUserModel, CustomerUserModel, AdminUserModel) • Populati modelul de baza dintr-un singur loc
  • 23. Repopulare date comune in Model • 2 sau mai multe modele contin aceleasi date • Creati o structura de clase (BaseUserModel, CustomerUserModel, AdminUserModel) • Populati modelul de baza dintr-un singur loc ?
  • 24. Agregare date pentru o actiune • Daca avem nevoie de acelasi ActionFilter in mai multe actiuni, atunci incercati sa le puneti intr-un sigur loc (intr-un BaseController) • Folositi ActionFilter pentru a transforma datele care vin din diferite locatii in parametri pentru actiune
  • 25. Fat Controller • Apeleaza direct baza de date • Proceseaza informatia • Logica din el este foarte complexa – toata partea fun este in controller • Are foarte multe actiuni • Multe entitati sunt cuplate prin intermediul controller-ului • Greu de inteles, modificat si testat • Controller-ul nu trebuie sa fie strans legat de domeniu • Nu el trebuie sa fie dirijorul aplicatiei noastre • Un controller per functionalitate si nu per entitate
  • 26. Fat Controller • Un controller per functionalitate si nu per entitate • Fiecare functionalitate care este oferita de catre aplicatia noastra poate sa fie reprezentata de catre un controller • Un controller per use case – nu este mereu posibil
  • 27. Actiunile apelate des nu sunt cache-uite • Daca avem actiuni care sunt apelate des, iar continutul ramane la fel, atunci putem sa folosim OutputCache • Nu poluati controller-ul cu configurarea cache-ului • Cache-ul trebuie configurat din web.config si nu din controller
  • 28. Framework-ul de DI este apelat direct • In anumite factory-uri (ControllerFactory) se apeleaza direct clase care tin de framework-ul de DI • Diferite proiecte folosesc diferite DI • Creati un wrapper peste acestea, care sa abstractizeze API-ul • Folositi Common Service Locator • Este o abstractizare peste mecanismul de DI, care iti permite sa folosesti acelasi API indiferent de ce framework de DI folosesti
  • 29. HtmlHelper - overused • Nu creati un extension method la un HtmlHelper daca nu este folosit cel putin in doua locuri • Incercati sa grupati aceste metode sub un nod comun daca se poate • O sa fie mai usor de folosit si de inteles HtmlHelper .Table() .BoxList() .Pivot .Product() – returneaza ProductHtmlHelper .FormatPrice() .Stock() … …
  • 30. JavaScript in View • Oricat de scurt este JavaScript-ul nu il puneti in view • JavaScript-ul o sa polueze view-ul si o sa il faca greu de inteles • Nu faceti apeluri AJAX din View • Nu hardcodati adresa url pentru AJAX in JS – use UrlHelper • Ce se intampla daca o actiune se redenumeste ? • Ce se intampla daca locatia unei resurse se schimba? • Trebuie facute in mai multe locuri modificari
  • 31. View-uri foarte lungi • Cat de normal este sa ai un view de 100 de randuri, iar codul sa se repete? • Cat de normal este ca intr-un FOR dintr-un view sa se afiseze contintul unui “sub-model” direct? • Pentru aceste cazuri se poate folosi Partial View • Nu conteaza daca acesta are doar 2 randuri sau 10 • Reutilizarea codului creste • Devine mai clar • Mai usor de citit si testat
  • 32. Q&A