Tranziția sistemului dintr-o stare în alta, adică de la o pagină la alta, se realizează prin extensii ale tipului Controller din librăria ASP.NET MVC. Pentru fiecare cerere de la client există o mapare definită în Global.asax (care acționează ca și o funcție main în aplicațiile ASP.NET) între URL-ul cerut și un controller specific. Mapările sunt în general de forma {controller}/{action}/{id}. Pentru aplicația aceasta în particular se folosește {username}/{controller}/{action}/{id}, excepții fiind autentificarea utilizatorului și pagina principală.
Pentru a servi noi pagini, metodele oferite trebuie să returneze instanțe ale tipului ActionResult, cele mai frecvente sunt RedirectToActionResult, ViewResult și EmptyResult.
În general aceste clase vor crește foarte mult, motiv pentru care partea de business logic a fost mutată în modulul pentru servicii, singura responsabilitate fiind de a apela prin mesaje instanțele specifice de servicii și de a forma modelul ce va fi transmis modulului de prezentare.
4.3 Modelul aplicației
Acest strat al aplicației grupează domeniul și serviciile care operează asupra acestui domeniu. Ca urmare a acestei grupări, modelul aplicaţiei este format din două module: Domain și Services. În Domain vom găsi clasele de bază, iar Services conțin implementarea pentru partea de logică a aplicației.
4.3.1 Domeniul aplicației
În centrul metodologiei Domain Driven-Design stă partea de domeniu a aplicației. Acesta trebuie rafinat pentru a cuprinde toate conceptele specifice produsului dezvoltat. În cazul aplicației avem ca și element central tipul Article, care extinde tipul de bază Entity. Entity reprezintă instanțele care au o identitate bine stabilită în cadrul aplicației și suprascrie metodele de bază pentru oferirea unui mecanism de descoperire a egalității.
Un articol încapsulează titlul, textul, data creării, data publicării ș.a.m.d. El este central acestei aplicații, întrucât scopul său principal este de a publica text fie sub forma unor postări în blogul personal, fie comentarii, întrebări, laboratoare, pagini de documentație. Lista poate continua foarte mult, întrucât pe această noțiune de articol se pot clădi în continuare noi elemente.
4.3.2 Serviciile aplicației
Acest modul grupează o serie de metode specifice diverselor facilități oferite de aplicație. Ele sunt grupate în funcție de categoriile existente pentru această versiune și anume Blogs, Questions, Classes, My Classes. Există câteva servicii care nu au o categorie asignată întrucât sunt comune și atunci au fost grupate în folderul principal.
Toate serviciile sunt declarate ca și interfețe și au rolul de a stabili contractul pe care implementări ulterioare vor fi nevoite să le respecte. Pentru a le utiliza aceste servicii, pe care eu personal le consider dependințe, pot fi declarate fie ca și parametrii în constructorul clasei, fie ca și proprietăți. Eu am preferat ca parametrii să fie declarați în constructor, întrucât consider că stabilește un contract mult mai puternic prin declararea dependințele în acest mod.
Inițializarea instanțelor în cadrul aplicației se face prin intermediul IoC-ului și ca atare toate dependințele vor fi injecate și construite pe baza configurării în mod automat.
4.4 Modulul de prezentare al aplicației
Modulul de prezentare este construit pe baza tehnologiei ASP.NET de prelucrare a paginilor. MVC modifică stilul implicit care cerea existența unei clase legată de fișierul aspx și în schimb oferă posibilitatea moștenirii din tipul System.Web.Mvc.ViewPage. Adițional, MvcContrib oferă MvcContrib.FluentHtml.ModelViewPage ca și bază de creare a paginii.
Similar paginilor de tip JSP, tehnologia ASP.NET parsează fișierul cautând simbolurile <% și %> sau <%= și %>. Tot ce este în afara acestor delimitatori e automat transformat în expresii de tipul Writer.Write(“”), iar expresiile din interior sunt transformate în cod care este executat normal ca și cod C# sau VB.NET de motorul ASP.NET.
Tipul de bază utilizat fără specificarea unui Model ca și template, în ASP.NET MVC, va permite utilizarea oricărui obiect ca și model sau includerea în ViewData a informațiilor. Pe de altă parte, folosirea unui tip de date ca și model oferă, cu ajutorul librăriei MvcContrib.FluentHtml, posibilitatea de a nu folosi specificări prin string a mapării proprietăților, ci se pot folosi construcții de tipul this.TextBox(m=>m.Id).ReadOnly()care va genera o etichetă html de forma . Această facilitatea este importantă, întrucât cadrul ASP.NET MVC oferă posibilitatea de a mapa rezultatele apelului fie prin GET, fie prin POST direct pe entități specificate ca și parametri ai acțiunii pe controller.
Întrucât datele prezentate pe o pagină sau alta a aplicației nu se mapează întotdeauna unu la unu cu modelul definit este necesară definirea unor modele (value objects) care să păstreze informațiile pe care le vom da paginii. Acest șablon este din ce în ce mai folosit, mai ales în noile aplicații Silverlight și WPF care, similar cu HTML-ul, oferă posibilitatea separării clare dintre prezentare și logică și a fost denumit ModelView-ViewModel.
Capitolul 5. „Universum”
Scopul declarat al aplicației este de a permite studenților din universitate să comunice unii cu alții, să își prezinte descoperirile, să găsească răspunsuri la întrebări și să permită profesorilor organizarea cursurilor și prezentarea laboratoarelor.
5.1 Rolurile utilizatorilor
Aplicația permite utilizatorilor unul din următoarele roluri: super, anonymous, teacher și student. Actualmente, asignarea rolurilor se face printr-un serviciu care validează numele de utilizator cu șablonul utilizat de facultate, în consecință, numele de studenți sunt de forma : patru litere, patru cifre. Pentru superuser este stabilit un cont apriori la fel cum pentru anonymous este unul implicit, iar pentru profesor tot ce nu intră în celelalte categorii. Configurația acestui serviciu e făcută printr-un fișier xml tocmai pentru a putea fi ulterior suprascrisă cu ușurință, în ideea că se va dori realizarea autorizării pe baza unui serviciu web, a unei baze de date sau prin LDAP.
5.1.1 Atribuțiile asociate utilizatorului cu rol de „super”
Acest utilizator are ca și atribuții evaluarea feedback-ului din partea comunității, înregistrare de utilizatori și mediator pentru întrebările postate care sunt marcate ca fiind „offensive”, putând să le scoată acest atribut sau să șteargă întrebarea.
Pentru varianta actuală nu este nevoie de mai multe funcții, deoarece nu doresc să îi ofer drept de cenzură asupra materialelor publicate, cât despre conținuturile din bloguri și materialele profesorilor, acestea sunt proprietatea individuală a fiecăruia, în cazul unor comentarii nepotrivite sau obscenități putând fii foarte ușor identificate persoanele responsabile.
5.1.2 Atribuțiile asociate utilizatorului cu rol „anonymous”
Aceștia sunt tratați ca și vizitatori, au acces doar la resursele aflate în bloguri, întrebări și articolele publicate de profesori. Nu vor putea posta comentarii la materialele publicate și nici nu vor avea access la temele de laborator.
5.1.3 Atribuțiile asociate utilizatorului cu rol „teacher”
Un profesor are acces la crearea unui blog personal, adăugarea de comentarii, crearea de întrebări, adăugarea de răspunsuri, punctarea sau depunctarea anumitor întrebări, organizarea structurii cursului, a articolelor pe care le publică pentru acel curs și a temelor de laborator pe care le propune spre rezolvare, vizualizarea temelor depuse și notarea acestora.
5.1.4 Atribuțiile asociate utilizatorului cu rol „student”
Un stundet are acces la crearea unui blog personal, adăugarea de comentarii, crearea de întrebări, adăugarea de răspunsuri, punctarea sau depunctarea anumitor întrebări, vizualizarea gamei de cursuri existente, înscrierea la cursuri, vizualizarea structurii cursului, articolelor, temelor propuse pentru laborator și trimiterea rezolvării pentru tema de laborator.