În ziua de astăzi, tehnologia a acaparat toate segmentele vieții sociale si aproape [607576]
Introducere
În ziua de astăzi, tehnologia a acaparat toate segmentele vieții sociale si aproape
orice informație se poate găsi pe Internet. Cu ajutorul acestui domeniu, multe dintrea
activitățile unei persoane se pot realiza în mediul online, cum ar fi: găsirea unui loc de
muncă, socializarea cu prietenii și multe altele.
În domeniul muzical, am observat că tehnologia nu a avansat așa cum ne -am fi
așteptat. În urma acestei concluzii, m -am decis să realizez o aplicație care, pe de o parte
să poată prom ova interpreții tineri în scopul găsirii unei formații muzicale adecvate, iar
pe de alta, să permită trupelor muzicale să identifice potențiali soliști și instrumentiști
pentru fiecare post liber.
Pentru promovarea într -o trupă, cântarețul va trebui iniția l să trimită, precum la
un interviu, interpretarea unei piese muzicale solicitată de către formație. Un lider de
trupă va putea observa nivelul cunoașterii muzicale a candidat: [anonimizat], analizând totodată dacă acesta s -ar putea integra în echipă.
Motivul pentru care am realizat această aplicație este faptul că, acum câțiva ani
am început să învăț un instrument muzical, fără însă a reusi să găsesc o trupă potrivită.
În România, interviurile pentru ocuparea unui post într -o trupă încă se desfășoară
pe forumuri și grupuri de socializare, în timp ce în restul lumii am găsit aplicații
specializate care grupează anunțurile în funcție de zonă, însă procesul de recrutare a
rămas același.
În acest document voi prezenta trei capitol e care cuprind:
• tehnologiile utilizate și cum m -au ajutat la dezvoltarea acestei aplicații;
• prezentarea propriu -zisă a aplicației în care voi arăta comportamentul și
funcționalitățile acesteia;
• dezvoltarea aplicației, în care voi descrie cum au fost crea te cele mai importante
funcționalități.
1. Tehnologii folosite
1.1 Limbajul C#
Limbajul de programare C# este un limbaj de programare orientat -obiect care
aduce o abordare nouă față de predecesorii acestuia, C și C++. Realizat de către
Microsoft în anul 2000, acest limbaj a venit ca răspuns al celebrului limbaj Java , având
o serie de asemănări cu acesta în ceea ce privește conceptele și domeniile de utilizare.
Precum în Java și în alte limbaje orientat -obiect, C# utilizează clase ce conțin
variab ile și metode ce descriu acțiunea variabilelor în cadrul unei aplicații. Gestionarea
variabilelor a fost îmbunătățită în acest limbaj și pot fi utilizate sub formă de proprietăți.
O proprietate reprezintă o variabilă ce conține la inițializare două metode importante
pentru accesarea acesteia:
• get – o metodă care va returna valoarea variabilei;
• set – o metodă care va atribui variabilei o valoare de acelasi tip.
Un exemplu de proprietate ce se regasește în aplicație este următorul:
//Se declara variabila ContentType de tip string
// si i se vor asocia cele doua metode get si set
public string ContentType { get; set; }
Pentru a evita probleme de securitate în cadrul aplicației și pentru a nu apela
orice metodă în orice parte a programului, limbajul a păst rat specificatori de acces
precum cei din C++: public, protected, private și internal . Specificatorul public va
permite unei clase să fie apelate din interiorul oricărei clase ale proiectului,
specificatorul protected are rolul de a permite apelarea clasei respective doar de către o
clasă moștenită din aceasta, specificatorul private va permite unei metode să fie apelate
doar în cadrul clasei din care provine, iar ultimul specificator, internal , va permite
accesarea unei metode de către o altă clasă ce se a flă în același assembly cu clasa
originară metodei.
Procesul de compilare al codului în C# este următorul: se compilează codul sursă
într-un modul, care va fi translatat în cod assembler de tip Intermediate Language . Acest
cod va fi transformat în cod mași nă și va fi compilat de către Just In Time Compiler.
Printre cele mai importante proprietăți ale acestui limbaj se pot enumera:
simplitatea și modernitatea, faptul că este orientat -obiect, siguranța tipului și
scalabilitatea. Simplitatea limbajului este da tă de către recomandarea de a nu folosi
pointeri și faptul că nu se mai lucrează în mod direct cu alocarea și dezalocarea
memoriei. C# oferă utilizatorului posibilitatea de a lucra cu accesarea pointer -ilor în
proiect și va trebui setat modul unsafe , însă va avea unele limitări față de cum pot fi
folosiți în C/C++. Modernitatea este bazată pe puterea de a crea o aplicație bazată pe
acest limbaj ce poate fi utilizată pe versiuni diferite, fără a exista diferențe sau modificări
ulterioare.
C# suportă concepte le de programare orientată pe obiecte: polimorfism, interfețe
și moștenire . Acestea ajută enorm de mult la o aplicație complexă prin structurarea
eficientă a claselor și implementarea serviciilor. Față de predecesorul său, C++ ,
limbajul a eliminat conceptu l de moștenire multiplă, astfel încât, o clasă copil poate
moșteni o singura clasă părinte , putând moșteni mai multe intefețe.
De asemenea, siguranța tipului nu îi permite utilizatorului să realizeze schimbări
ale tipului de variabilă (precum o variabilă d efinită de tip string să fie utilizată mai târziu
ca o variabilă de tip int și sa îi aplicăm metode specifice unui număr întreg), prevenind
astfel erori de tip runtime .
Fig. 1: Procesul de compilare al codului C#
Sursa: https://rthumati.files.wordpress.com/2010/05/compiling2.jpg
1.2 .NET Framework
.NET Framework reprezintă un framework dezvoltat de către Microsoft în anul
2002 care duce la construirea unei aplicații web, folosindu -se de limbajul de programare
C#. Această arhitectură este alcătuită din trei componente importante: Common
Language Runtime (CLR) , libraria framework -ului și limbajul .
Programele scrise în acest framework sunt executate de către Common Language
Runtime care va genera o mașină virtuală a aplicației ce este capabilă de mai multe
operații ce țin cont de gestionarea funcționării corecte a proiectului precum : securitatea
aplicației și modul în care este administrată și dezalocată memoria. Printre
funcționalitățile importante ale CLR-ului pute m preciza Garbage Collector și tratarea
excepțiilor ce sunt aruncate în timpul rulării aplicației, la runtime .
Garbage Collector pornește o acțiune de eficientizare a memoriei alocate în
cazul în care s -a atins un anumit prag și va avea în vedere resursel e care nu au mai fost
folosite și, astfel, se vor putea dezaloca cu certitudine. În ceea ce privește tratarea
excepțiilor, .NET va putea arunca un mesaj de eroare ce conține acțiunea care a provocat
această excepție și o listă de fișiere organizate sub for mă de stivă care ilustrează întregul
parcurs al excepției ce a declanșat eroarea.
A doua componentă din arhitectura .NET Framework este reprezentată de o
bibiliotecă de clase numită Framework Class Library (FCL) . Această bibliotecă
cuprinde clase definite de către sistem cu metode ce pot fi apelate în proiect, iar cu
ajutorul bibiliotecii se pot manipula date, fișiere de tip input și output și multe altele.
Ultima componentă a .NET Framework se bazează pe limbaje și modul cum
acestea completează progresul u nei aplicații de la compilator către partea de client a
aplicației. Concepte precum interfața pentru utilizator, conexiuni la baza de date,
dezvoltarea aplicațiilor web și cele de tipul Web-forms pot fi implementate cu ajutorul
acestei tehnologii împreună cu ASP.NET, ADO.NET sau WinForms .
Pentru că inițial .NET Framework a fost destinat doar sistemului Microsoft
Windows , în urmă cu 2 ani, în 2016, a apărut un nou framework compact denumit .NET
Core pentru a elimina problema portabilității și pentru a -și atr age utilizatori ce utilizează
sistemele cu versiuni de Linux și MacOS.
1.3 ASP.NET MVC
ASP.NET (Active Server Page) a luat naștere din nevoia de a dezvolta aplicații
în arhitectura .NET și a fost lansată odată cu sistemul Web Forms în anul 2002. La
încep ut acesta era destinat dezvoltării aplicațiilor de tip Web Forms și în perioada
respectivă a avut un succes răsunător pe piața aplicațiilor din întreaga lume.
În 2007, această arhitectură a dezvoltat în paralel o nouă platformă denumită
ASP.NET MVC (Model View Controller) datorită utilizării acestui concept în
dezvoltarea aplicațiilor web ce asigura mai multă claritate în cod. Pentru introducerea
acestei platforme în detrimentul aplicațiilor vechi de tip Web-forms , ASP.MVC a permis
utilizarea codului din ap licațiile vechi fără a produce prea multe modificări.
Conceptul Model -View -Controller este alcătuit din trei componente:
• Modelul păstrează informații sugestive ce pot fi vizualizate în View și manipulate
de către Controller;
• Controller -ul creează sau reînc arcă informații în componenta Model și este
singurul care poate schimba starea aplicației; la final modelul va fi trimis către View;
• View -ul construiește interfața aplicației pe baza modelului primit.
Fig. 2 : Arhitectura Model -View -Controller
Sursa: https://docs.znframework.com/mvc -model -view-controller/controllers
Această separare a conceptelor ajută la simplificarea dezvoltării și structurarea
mult mai logică a aplicației, iar comportamentul adăugat de către dezvoltator nu va fi
inclus în interfața utilizatorului.
Framework -ul se bazează pe arhitectura .NET , astfel că, pentru definiția unei
clase de tip controller se va moșteni clasa Controller furnizată de către biblioteca
System.Web.Mvc.
O altă funcționalitate importantă adusă odată cu acest framework o reprezintă
personalizarea unui View sau a unui Controller . Aceasta se găsește în aplicația „Find
my band” prin adăugarea unor variabile ce păstrează serviciile disponibile pentru
accesarea informațiilor din baza de date și sesiunea curentă dintr -o pagină. Orice
controller din aplicație care va returna view-uri și acțiuni trebuie să moștenească un
controller de bază, configurat în felul următor:
public class BaseController : Controller
{
// se adauga un singleton de tip RepositoryFactory
care acces eaza
// metode de manipulare a datelor din baza de date
protected RepositoryFactory Services;
// se adauga un wrapper care va putea administra
informatiile din
// sesiunea pe browser
protected new SessionWrapper Session =
SessionWrapper.Instance;
protected BaseController()
{
this.Services = new RepositoryFactory();
}
}
Pentru toate view-urile din aplicație am creat un view părinte care păstrează doar
informații din sesiunea curentă. În mod normal, această funcționalitate permite
atribuirea o ricărei proprietăți de care este nevoie la afișarea unui view. Următorul cod
moștenește o clasă generică din biblioteca System.Web.Mvc, iar orice view îl va moșteni
pe acesta și va fi setat în XML -ul ce ține de configurarea aplicației:
public abstractclas sBaseView <TModel> :
WebViewPage<TModel>
{
protected new SessionWrapper Session =
SessionWrapper.Instance;
}
1.4 Entity Framework
Entity Framework este un ORM (object -relational mapping) pentru aplicații
.NET care creează o legatură între o clasă din C# și o tabelă din SQL Server . Această
tehnologie îi permite programatorului să acceseze date dintr -o tabelă a bazei de date cu
ușurință, iar modificările în baza de date se vor face direct din aplicație cu ajutorul
acestui framework.
Sunt două abordări ce pot fi aplicate la crearea unei aplicații noi: Database First
și Code First . Prima variantă este folosită în cazul în care baza de date este existentă,
dar se creează o nouă aplicație în jurul ei. Abordarea Code First constă în adăuga rea
unor clase C# ce reprezintă entitățile în baza de date și translatarea acestora în baza de
date după modelul creat. Pentru aplicația „Find my band” am utilizat varianta Code
First.
Fiecare tabelă din baza de date este asociată clasei, iar pentru a crea legături de
tip Foreign Key sau o cheie primară vom aplica clasei C# proprietăți specifice tool-
ului. Pentru a exemplifica utilitatea acestui utilitar în aplicația mea, voi reprezenta codul
scris pentru a crea două tabele User și UserType și o relaț ie de One-To-Many între cele
două tabele.
//Definirea clasei User
public class User
{
public int Id { get; set; }
public UserType UserType { get; set; }
}
//Definirea clasei UserType
public class UserType
{
public int Id { get; set; }
public string Name { get; set; }
public List<User> Users { get; set; }
}
//Adaugarea relatiei intre cele doua tabele
this
.HasRequired(ut => ut.UserType)
.WithMany(u => u.Users)
.HasForeignKey(ut => ut.Type Id);
Pentru efectuarea modificărilor și a păstrării în sincronizare a modelelor din C#
cu baza de date SQL Server, Entity Framework utilizează migrări . O migrare reprezintă
orice modificare a unui tabel sau a unei constrângeri care trebuie publicată în baza de
date și pot fi accesate versiuni anterioare în cazul în care modelarea bazei de date nu a
fost reusită. Generarea migrărilor este făcută automat de framework și vor fi create câte
o clasă C# per migrare precum în următoarea imagine:
Fig. 3: Pă strarea migrărilor
1.5 Front -end
1.5.1 HyperText Markup Language
HyperText Markup Language , cunoscut după abrevierea HTML , reprezintă un
limbaj de marcare ce are rolul de a ilustra informații într -o pagină web și face parte din
componenta vizuală a unei aplicații. Totalitatea elementelor dintr -o pagină alcătuiesc
structura paginii web , care sunt interpretate și afișate de către browser .
Un document HyperText Markup Language trebuie să conțină două zone
importan te: head și body . Elementul head conține informațiile despre titlul paginii și
legături către fișiere de tip style (Css) sau de tip script (JavaScript) . Al doilea element
cuprinde toate informațiile care vor fi afișate de către browser în pagina web și poa te
conține o serie de elemente precum: header, paragraf, hyperlink -uri (care ne ajută să
navigăm în aplicația web ), imagini, tabele.
Pentru această aplicație am folosit un framework pentru aplicație web numit
ASP.NET Razor care curprinde atât cod HyperText Markup Language , cât și cod C#.
Această îmbinare este folosită pentru arhitectura Model -View -Controller deoarece se
poate trimite un Model cu de date dintr -un Controller direct într -o pagină HTML .
Această pagină reprezintă View -ul în aplicație și are extensia .cshtml.
Dezvoltat de către Microsoft în 2010, ASP.NET Razor a reprezentat o schimbare
importantă de la vechiul ASP.NET Web Forms și a simplificat componenta View a
arhitecturii Model -View -Controller prin optimizarea sinta xei codului HTML generat și
introducerea IntelliSense (un mecanism de identificare a erorilor în aplicație).
Fig.4: Exemplu de View creat prin ASP.NET Razor
1.5.2 Cascading Style Sheets
Dacă structura unei pagini web se realizează în HTML , de stilizar ea interfeței
pentru utilizator se ocupă Cascading Style Sheets . Acest limbaj a fost construit pentru a
separa conținutul dintr -o pagină web de către design -ul aplicației și datorită acesteia,
mai multe pagini web pot avea elemente stilizate asemanător doa r având referințe la un
singur fișier CSS.
Sintaxa unui stil este ușor de utilizat și cuprinde cuvinte sugestive din limba
engleză. Cascading Style Sheets se aplică unor elemente de tip HTML care sunt accesate
de către un selector . Acesta stabilește ce p arte a conținutului va fi supusă unei schimbări
de stil și se poate aplica pe fiecare element din pagină sau doar pentru o clasă sau un id
specific. O clasă poate fi atribuită mai multor elemente de tip HTML, iar un stil aplicat
clasei respective va afecta toate elementele ce îi corespund, însă un id poate fi aplicat
unui singur element de tip HTML și stilul se va aplica doar pe acesta. După ce am stabilit
selectorul, va trebui să adăugăm proprietăți în interiorul acestuia pentru a ne defini cum
va fi înfăț ișat elementul în pagină.
1.5.3 JavaScript
JavaScript este un limbaj de scriptare de tip orientat obiect care este utilizat
pentru modificarea elementelor și adăugarea funcționalităților într -o pagină web.
Apărut în anul 1995, JavaScript este cel mai utilizat limbaj pe partea de front -end a unei
aplicații web , prin biblioteci precum Jquery, Angular, Node.Js, React și multe altele.
Chiar dacă în primă fază ne duce cu gândul la limbajul Java , cele două sunt
diferite. JavaScript împreună cu CSS și HTML reprezintă cele trei tehnologii de bază
ale World Wide Web -ului, fără de care o aplicație web nu ar putea afișa informații în
pagină. Astfel, contribuția fiecărui limbaj la o pagină web este următoarea:
• HTML – prezentarea conținutului în pagin ă;
• CSS – stilizarea paginii;
• JavaScript – definirea comportamentului unei pagini web.
Fiecare browser conține un arbore de elemente denumit Document Object Model
(DOM) . Acest arbore prezintă cum sunt structurate elementele într -o pagină web și cum
pot fi gestionate cu ușurință de către JavaScript . Datorită standardului W3C , fiecare
browser trebuie să respecte anumite reguli în ceea ce privește definiția DOM -ului pentru
portabilitatea script -urilor și păstrarea experienței utilizatorului în o rice browser .
Fig. 5 Structura arborelui de elemente ( Document Object Model )
Sursa: http://www.openbookproject.net/tutorials/getdown/css/lesson4.html
1.5.4 Jquery
Jquery este cea mai folosită bibliotecă open -source pentru JavaScript care aduce
programatorului front -end mai multa logică și simplitate scrierii de cod pentru
comportamentul elementelor din HTML . Această bibliotecă permite accesarea
elementelor și manipularea a cestora folosind arborele de obiecte DOM , crearea de
evenimente în browser și adăugarea unui comportament al paginii pe baza acestora (de
exemplu, la click pe un buton al paginii se poate crea un eveniment care să afișeze sau
să elimine elemente în DOM ). Alte funcționalități ale Jquery sunt atribuirea sau
schimbarea proprietăților unui element HTML sau a unui stil de tip CSS.
Una din cele mai importante caracteristici ale acestei bibilioteci este
implementarea AJAX (Asynchronous JavaScript And XML ) care permite ca transferul
de date între partea de client și cea server a unei aplicații să fie realizată asincron.
Această abordare asincron ajută la experiența utilizatorului în aplicație prin modificarea
conținutului fără a mai reîncarca pagina curentă.
La baza acestui concept se află protocolul Hypertext Transfer Protocol (HTTP)
care permite accesarea unor informații pentru aplicațiile distribuite și are forma cerere –
răspuns . Comunicarea în World Wide Web este realizată prin acest protocol și se asigură
date și informații între un client ( navigator web ) și un server . În cazul în c are se
accesează un link de către un utilizator, protocolul va ști opțiunea acestuia (dacă a trimis
un răspuns HTTP – POST – sau a solicitat o cerere HTTP – GET ). AJAX va aduce un
rezultat în funcție de cererea utilizatorului, va procesa acțiunea și va trimite un răspuns
dacă operația a fost realizată cu succes sau dacă au apărut erori de server.
1.5.5 Bootstrap
Bootstrap a fost proiectat de către un dezvoltator al fi rmei Twitter , Mark Otto, și
a pornit inițial ca un proiect intern în companie. Observând cât de practic este acesta la
crearea design -ului aplicației, mai mulți programatori au contribuit la această bibliotecă,
astfel că acest framework a ajuns în ziua de astăzi la cea de -a patra versiune.
Bootstrap este o bibliotecă destinată aplicațiilor web și cuprinde caracteristici ce
ajută la stilizarea elementelor de tip HTML . Printre cele mai importante se numără:
aplicarea unui stil ce va rămâne responsive , adică se va adapta în funcție de dimensiunile
ecranului dispozitivului folosit (inclusiv pe cele mobile), are un sistem de încadrare în
pagină bazat pe linii și coloane care ajută la organizarea conținutului pe pagină și cel
mai important este îmbunătățirea expe rienței utilizatorului prin adăugarea unei clase din
Bootstrap .
1.6 SQL Server
SQL Server a dost creat de Microsoft în anul 1989 și reprezintă un sistem de
gestiune al bazelor de date relaționale ce este alcătuit din limbajul de interogare SQL,
care se ocupă de preluarea informațiilor, și limbajul procedural T-SQL, care se ocupă de
gestionarea bazelor de date din sistem.
Baza de date reprezintă nucleul aplicației, unde se stochează toate datele
necesare din site și poate fi gazduită pe unul sau mai mult e servere. De la o aplicație de
dimensiuni mici, până la o aplicație bancară ce deține o cantitate de date de ordinul
milioanelor de înregistrări, SQL Server este un sistem stabil, ce rivalizează cu Oracle
Database și cu MySQL .
Pentru a facilita accesul ș i utilizarea acestui sistem, Microsoft a dezvoltat o
interfață grafică numită SQL Server Management Studio prin care se pot crea servere ,
baze de date, tabele , view -uri, proceduri stocate , triggeri la modificări de tip create,
update sau insert, funcții și diagrame pentru a vizualiza schema bazei de date.
Motivul alegerii acestui sistem de gestionare a bazei de date a fost integrarea
arhitecturii .NET Framework cu bazele de date SQL Server , precum și posibilitatea
conectării într -un mod facil prin utilizar ea unui ORM precum Entity Framework .
1.7 Microsoft Visual Studio
Microsoft Visual Studio este un mediu de dezvoltare ( IDE – indegrated
development enviroment ) ce permite programatorului să dezvolte aplicații web precum
ASP.NET Web forms , ASP.NET MVC , servicii WCF , aplicații scrise în limbajul Visual
Basic și Visual F# , proiecte ce oferă conexiunea la o bază de date SQL Server sau chiar
aplicații în Python . Visual Studio oferă o gamă largă de dezvoltare a unei aplicații, atât
în domeniul web, cât și în cel mobil ( Xamarin ).
IDE-ul oferit de către Microsoft împachetează toate tehnologiile oferite de
această companie într -un singur spațiu de lucru, dar și alte tehnologii care pot fi integrate
cu ușurință pentru realizarea unei aplicații ce ține pasul cu avansu l tehnologic din acest
domeniu.
O caracteristică importantă a acestui mediu de dezvoltare este reprezentată de
debugger -ul din aplicație cu care se pot observa operațiile realizate la fiecare pas în
aplicație. De asemenea, există un editor denumit Intelli Sense care ajută la completarea
automată de cod în cazurile în care se dorește generarea unui constructor pentru o clasă,
a unei metode care încă nu a fost implementată sau a unei clase către care avem o
referință în cod inexistentă.
Microsoft oferă posibi litatea adăugării unui proiect în două sisteme de control al
versiunilor: Team Foundation Server (TFS) și Github . Până în momentul de față, TFS
împreună cu Visual Studio oferă simplitate dezvoltatorului în a publica câte o versiune
pentru modificările importante ale codului prin adăugarea unui comentariu legat de
contribuția sa și, opțional, atribuirea task-urilor rezolvate prin publicarea codului.
În cazul în care serve rul de TFS asociat proiectului nu a fost creat, el se poate
crea imediat de pe site -ul IDE-ului, iar proiectul se adaugă în proiectul de pe server. În
plus, dacă se dorește revenirea la o versiune anterioară sau compararea cu ultima
versiune de pe server s e poate realiza astfel:
Fig. 6 Prezentarea IDE-ului Visual Studio și a Team Foundation Server
1.8 Design pattern și utilitatea în aplicație
Utilizarea design pattern -urilor în aplicație va duce la îmbunătățirea calității
codului scris și va reduce mult din timpul alocat dezvoltării unui produs. Introducerea
acestora vor asigura un cod mult mai bine structurat și organizat, aducând un mare
avantaj proiectelor mari în c are mai mulți programatori vor lucra pe aceeași aplicație.
Chiar dacă acest capitol este cunoscut de către persoanele cu experiență în
domeniu, am încercat să aduc un plus de extensibilitate aplicației mele prin
implementarea unor pattern -uri. În condițiil e în care aplicația va avea succes, nu se
poate exclude posibilitatea ca un alt programator să lucreze la acest proiect, iar
experiența acestuia la dezvoltarea și extinderea aplicației ar trebui să fie una
mulțumitoare.
1.8.1 Singleton
Conceptul de single ton reprezintă unul dintre cel mai simplu design pattern și
are rolul de a crea un singur obiect din clasa respectivă și acesta să fie folosit pe
parcursul rulării aplicației. Chiar dacă într -o aplicație de dimensiuni mici nu se poate
vorbi de încărcarea m emoriei, în momentul în care o aplicație va fi extinsă la mai multe
proiecte ce folosesc o serie de obiecte instanțiate dintr -o clasă, vom avea nevoie de acest
concept pentru optimizarea aplicației. Această variabilă de tip singleton poate fi folosită
în condițiile în care se va dori păstrarea informațiilor pe timpul întregii sesiuni a
utilizatorului fără a se modifica tipul variabilei de la începutul sesiunii până la finalul
acesteia.
Structura unui singleton este definită simplu prin adăugarea unei variab ile statice
care va fi instanțiată o singură dată la crearea obiectului și un constructor privat care nu
îi va permite instanțierea unui obiect în cadrul altei clase din aplicație. Un exemplu
despre cum am implementat în „Find my band” un singleton pentru sesiunea
utilizatorului se regasește mai jos:
public class SessionWrapper
{
// variabila statica utilizata in aceasta clasa
private static SessionWrapper instance;
//instantierea obiectului daca nu exista
public static SessionWrapper Instance => instance ??
(instance = new SessionWrapper());
// constructorul privat
private SessionWrapper()
{
}
}
1.8.2 Dependency injection si Repository pattern
Cele doua concepte sunt utilizate împreună în aplicația „Find my band” și
asigură îmbunătățirea codului și reutilizarea acestuia pentru operațiile ce au rol de a
manipula baza de date.
Dependency injection , dupa cum spune și numele, permite unei clase să utlizeze
varibilele și metodele altei clase prin adăugarea unei r eferințe către un obiect instanțiat.
Conceptul de repository este reprezentat de felul în care o clasă poate avea un
set de metode ce vor fi apelate în funcție de ținta aplicației, fără a realiza schimbări
masive în cod. Se pot obține informații din mai m ulte clase ce au un comportament
asemănător, un exemplu foarte bun fiind momentul în care aplicația va trebui să se
conecteze la două baze de date și se vor defini două referințe într -o singură clasă, fără a
mai repeta codul.
De asemenea, în cazul în care vom dori să adăugăm o clasă de testare ce va
verifica funcționalitatea corectă a aplicației, vom adăuga doar o referință către aceasta,
ce va fi inițializată în constructor, fapt ce demonstrează eficiența oferită de către acest
pattern.
În această aplicați e am folosit aceste concepte pentru a favora extensibilitatea și
posibilitatea de se conecta la altă bază de date, pe lângă cea de SQL Server . Următorul
cod va prezenta pe larg cum a fost prelucrat contextul ce folosește operații de manipulare
în baza de d ate și cum este structurat codul astfel încât să poată fi modificat cu ușurință.
public class BandRepository
{
// Dependency injection: se va lua contextul
aplicatiei, cel care se conecteaza la SQL Server
protected ApplicationContext Context;
// conceptul va adauga referinta prin constructor
protected BandRepository(ApplicationContext context)
{
this.Context = context;
}
// O metoda specifica unui repository care poate fi
//folosita si de catre un alt context care poate fi
//adaugat pr in adaugarea unei referinte la alta baza //de
date
public Band GetBandById( int id)
{
return Context.Bands.AsNoTracking()
.Include(b => b.BandPlaysGenres)
.Include(b => b.BandPlaysGenres.Select(i =>
i.Genre))
.Include(b => b.UsersInBand)
.Include(b => b.UsersInBand.Select(i =>
i.Instrument))
.Include(n => n.UsersInBand.Select(u =>
u.User))
.FirstOrDefault(i => i.Id == id);
}
}
1.8.3 Factory pattern
Ultimul design pattern folosit în aplicație este cel care cuprinde toate clasele
rezultate din pattern -ul repository și are rolul de a oferi o interfață dezvoltatorului să
poată administra serviciile și modul în care acestea sunt folosite în aplicație.
Factory pattern , după cum sugerează și numele, poate fi văzut ca o fabrică ce
produce referințe către mai multe clase și poate fi extins în funcție de nevoile proiectului
de tip client. Pentru aplicația „Find my band” am inclus acest pattern pentru a apela
fiecare clasă repository ce cuprinde operații de manipulare a bazei de date dintr -un
singur loc al aplicației. Fiecare controller din proiect are un obiect de tip factory care va
putea accesa fiecare repository în funcție de acțiunile necesare. În cazul în care se va
adăuga o entitate nouă în baza de date și vom adăuga logica acesteia într -un repository ,
vom adăuga o nouă instanță a clasei respective pe care o vom apela de fi ecare dată când
este nevoie în aplicație.
public class RepositoryFactory
{
// adaugarea contextului pentru conexiunea prin
//Entity Framework
private ApplicationContext context;
public RepositoryFactory()
{
context = new ApplicationContex t();
}
// repository ce va aduce un singleton de tip
//userRepository
private UserRepository userRepository;
public UserRepository UserRepository =>
userRepository ?? (userRepository = new
UserRepository(context));
private GenreRepository genreRepository;
public GenreRepository GenreRepository =>
genreRepository ?? (genreRepository = new
GenreRepository(context));
private InstrumentRepository instrumentRepository;
public InstrumentRepository InstrumentRepository =>
instrumentRepository ?? (instrumentRepository = new
InstrumentRepository(context));
private BandRepository bandRepository;
public BandRepository BandRepository =>
bandRepository ?? (bandRepository = new
BandRepository(context));
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: În ziua de astăzi, tehnologia a acaparat toate segmentele vieții sociale si aproape [607576] (ID: 607576)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
