Sunteți pe pagina 1din 20

Capitolul 6

Arhitectura MVC
1. Obiective 2. Introducere. Arhitectura cu trei straturi 3. Arhitectura MVC 4. Arhitectura MVP 5. Aplicaii

1. Obiective
Obiectivul principal al acestui capitol este implementarea unui program dup ablonul arhitectural Model-Vizualizare-Prezentator (engl. Model-View-Presenter, MVP), o variant a arhitecturii clasice ModelVizualizare-Controlor (engl. Model-View-Controller, MVC). Ca obiective detaliate, vom avea: 1. Obiective de proiectare: particularizarea arhitecturii MVP pentru o aplicaie cu interfa de tip consol, subliniind faptul c arhitectura este independent de tipul interfeei cu utilizatorul; 2. Obiective de programare: realizarea unui meniu consol structurat pe niveluri; 3. Obiective diverse: calcularea distanei ntre dou puncte de pe suprafaa Pmntului definite de coordonatele lor geografice.

2. Introducere. Arhitectura cu trei straturi


Una din recomandrile de baz ale ingineriei programrii este structurarea arhitecturii unei soluii pe niveluri, adic mprirea sistemului n mai multe componente ordonate ierarhic, fiecare cu limitri legate de modul de interaciune. Din punct de vedere al terminologiei, se folosete strat (engl. tier) pentru a indica o separare fizic a componentelor, adic assembly-uri (dll, exe) diferite pe aceeai main sau pe maini diferite. Termenul de nivel (engl. layer) indic o separare logic a componentelor, de exemplu namespace-uri diferite.
131
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C#

O abordare simpl i des ntlnit este utilizarea unei arhitecturi cu dou straturi (engl. two-tier architecture). n acest caz, aplicaia separ stratul de prezentare de stratul datelor aplicaiei. Datele reprezint entitile care definesc problema i de obicei corespund unor tabele n baze de date. Clasele de prezentare au responsabiliti precum recepionarea intrrilor de la utilizator (texte introduse, apsarea unor butoane, alegerea unor opiuni din meniuri etc.), apelurile ctre stratul de date, deciziile privind informaiile care vor fi artate utilizatorului i afiarea ieirilor (texte, grafice etc.). Aceste responsabiliti sunt destul de numeroase i, pe msur ce sistemul evolueaz, stratul de prezentare poate deveni suprancrcat. O soluie natural este divizarea acestui strat prea extins n dou alte straturi: de prezentare, pentru preluarea intrrilor i afiarea ieirilor, i respectiv de logic a aplicaiei, pentru asigurarea comunicaiilor cu stratul de acces la date i pentru luarea deciziilor de control. Stratul de logic include toate prelucrrile efective care manipuleaz datele interne i pe cele ale utilizatorului, cu ajutorul algoritmilor specifici, pentru a controla fluxul aplicaiei. Figura 6.1 prezint comparativ arhitecturile cu dou i trei straturi.

Figura 6.1. Arhitectura cu dou straturi (stnga). Arhitectura cu trei straturi (dreapta)

132
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC

3. Arhitectura MVC
Arhitectura cu dou straturi, n care se consider c schimbul de informaii are loc ntre interfaa cu utilizatorul i bazele de date (sau n general orice modalitate de stocare a datelor, inclusiv fiiere text, xml etc.) presupune ca din interfa s se acceseze i s se modifice direct datele. Totui, aceast abordare are cteva probleme semnificative. n primul rnd, interfaa cu utilizatorul se schimb de obicei mai des dect baza de date. n al doilea rnd, majoritatea aplicaiilor conin cod funcional (logica) ce realizeaz prelucrri mult mai complexe dect simpla transmitere de date. ablonul arhitectural Model-Vizualizare-Controlor izoleaz interfaa, codul funcional i datele, astfel nct modificarea unuia din aceste trei componente s nu le afecteze pe celelalte dou. O aplicaie bazat pe ablonul MVC va avea trei module corespunztoare: 1. Model: conine datele, starea i logica aplicaiei. Dei nu cunoate Controlorul i Vizualizarea, furnizeaz o interfa pentru manipularea i preluarea strii i poate trimite notificri cu privire la schimbarea strii. De obicei primete cereri privind starea datelor de la Vizualizare i instruciuni de modificare a datelor sau strii de la Controlor; 2. Vizualizare: afieaz Modelul ntr-o form potrivit pentru utilizator. Pentru un sigur Model pot exista mai multe Vizualizri, de exemplu o list de elemente poate fi afiat ntr-un control vizual precum ListBox, ntr-o consol sau ntr-o pagin web; 3. Controlor: primete intrrile de la utilizator i apeleaz obiectele Modelului pentru a prelucra noile informaii. Exist mai multe variante ale arhitecturii MVC, ns n general fluxul de control este urmtorul: 1. Utilizatorul interacioneaz cu interfaa aplicaiei, iar Controlorul preia intrarea i o interpreteaz ca pe o aciune ce poate fi recunoscut de ctre Model; 2. Controlorul trimite Modelului aciunea utilizatorului, ceea ce poate conduce la schimbarea strii Modelului; 3. n vederea afirii rezultatului de ctre Vizualizare, Controlorul i poate trimite acesteia o cerere de actualizare, sau Modelul i trimite o notificare privind schimbarea strii sale;
133
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C#

4. Vizualizarea preia datele necesare din Model i le afieaz. n continuare, aplicaia ateapt o nou aciune a utilizatorului iar ciclul se reia. Trebuie precizat c Modelul nu este doar o baz de date, ci ncapsuleaz i logica domeniului necesar pentru manipularea datelor din aplicaie. De multe ori se folosete i un mecanism de stocare persistent a acestora, de exemplu ntr-o baz de date, ns arhitectura MVC nu menioneaz explicit stratul de acces la date; acesta se consider implicit ca parte din Model. Figura 6.2 prezint relaiile structurale ntre cele trei module.

Figura 6.2. Relaiile structurale ntre componentele arhitecturii MVC

Pentru o aplicaie mai simpl, aceste module pot reprezenta clase. Din punctul de vedere al implementrii, sgeile de asociere nseamn c: Vizualizarea va avea un cmp de tip Model; de obicei va primi ca parametru n constructor o referin la obiectul Model; Controlorul va avea dou cmpuri de tip Vizualizare i Model; de obicei va primi ca parametri n constructor referine la obiectele Vizualizare i Model.

Mai ales n aplicaiile web, este clar definit separaia dintre Vizualizare (browser-ul) i Controlor (componentele server care rspund cererilor http). Prin separarea celor trei funcionaliti se atinge o cuplare slab ntre module, caracteristic dorit n toate programele deoarece modificrile dintr-o seciune a codului nu necesit modificri i n alte seciuni. Decuplarea scade complexitatea proiectrii i crete flexibilitatea i potenialul de reutilizare.

134
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC

Avantajele principale ale ablonului MVC sunt urmtoarele: Modificri rapide. Clasele ablonului trebuie doar s implementeze nite interfee prestabilite, astfel nct acestea s cunoasc metodele pe care le pot apela n celelalte clase. Cnd se doresc modificri, nu trebuie rescris o clas, se poate implementa una nou i se poate utiliza direct, chiar alturi de una veche. De asemenea, Vizualizrile i Modelele existente pot fi refolosite pentru alte aplicaii cu un Controlor diferit. Modele de date multiple. Modelul nu depinde de nicio alt clas din ablon. Datele pot fi stocate n orice format: text, xml sau baze de date Access, Oracle, SQL Server etc.; Interfee multiple. Deoarece Vizualizarea este separat de Model, pot exista n aplicaie mai multe tipuri de Vizualizri ale acelorai date. Utilizatorii pot alege mai multe scheme de afiare: mai multe skin-uri sau comunicarea n mai multe limbi. Aplicaia poate fi extins uor pentru a include moduri de vizualizare complet diferite: consol, interfa grafic cu utilizatorul n ferestre (desktop), documente web sau pentru PDA-uri.

4. Arhitectura MVP
n abordarea clasic, descris de Trygve Reenskaug pe cnd lucra la limbajul Smalltalk la Xerox PARC (1978-1979), logica este n Model, iar Controlorul gestioneaz intrrile de la utilizator. Pentru aplicaiile de tip consol, este relativ simplu ca intrrile s fie preluate de Controlor iar afiarea s se fac de ctre Vizualizare, pe baza datelor din Model. Pentru aplicaiile moderne, cu interfee grafice cu utilizatorul (GUI) precum ferestrele Windows, clasele de vizualizare sunt cele care primesc intrrile utilizatorului. De aceea, n astfel de situaii, Vizualizarea i Controlorul nu mai sunt clar delimitate. n Cocoa (unul din mediile de dezvoltare de aplicaii orientate obiect native ale Apple pentru Mac OS X) i DDay.MVC (proiectul DDay reprezint o colecie de biblioteci open-source pentru tehnologiile .NET), Controlorul conine logica aplicaiei. Pentru a rspunde noilor realiti ce privesc interaciunea utilizatorilor cu interfeele aplicaiilor, a fost propus ablonul ModelVizualizare-Prezentator, MVP. Aici, stratul de prezentare const n obiecte
135
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C#

de Vizualizare iar logica aplicaiei const n obiecte de control (Prezentator/Controlor). Pentru fiecare obiect de vizualizare exist un obiect de control. Din punct de vedere al terminologiei, se poate utiliza termenul de Controlor pentru Prezentator n ablonul MVP, deoarece acesta poate fi considerat o variant modern a ablonului clasic MVC. Dei ambele abloane, MVC i MVP, se bazeaz pe principiul comun al arhitecturii cu trei straturi, acestea au dou diferene majore: 1. n MVC, Controlorul primete i prelucreaz intrrile de la utilizator iar n MVP, Vizualizarea primete intrrile i apoi deleag prelucrrile ctre Controlorul corespunztor; 2. n MVC, Vizualizarea primete notificri privind schimbrile Modelului i afieaz noile informaii pentru utilizator. n MVP, Controlorul modific direct Vizualizarea, ceea ce face ablonul MVP mai uor de folosit dect ablonul MVC. Aceste diferene fac ablonul MVP mai atractiv dect ablonul MVC pentru aplicaiile din prezent.

4.1. Variante de actualizare a Vizualizrii


Cnd Modelul este actualizat, Vizualizarea trebuie de asemenea actualizat pentru a reflecta modificrile. Actualizarea Vizualizrii poate fi realizat n dou variante: Vizualizarea pasiv (engl. Passive View) i Controlorul supervizor (engl. Supervising Controller). Figura 6.3 ilustreaz modelele logice ale celor dou variante.

Figura 6.3. Vizualizarea pasiv (stnga) i Controlorul supervizor (dreapta)

n abordarea Vizualizrii pasive, Prezentatorul actualizeaz Vizualizarea pentru a reflecta schimbrile din Model. Interaciunea cu
136
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC

Modelul este gestionat exclusiv de Prezentator iar Vizualizarea nu i poate da seama direct de schimbrile din Model. La rndul su, Vizualizarea este actualizat exclusiv de ctre Prezentator. Abordarea este util atunci cnd Prezentatorul trebuie s realizeze unele prelucrri complexe asupra datelor, nainte de a afia informaiile pentru utilizator. Acestea apar de exemplu atunci cnd strile controalelor din interfaa grafic depind de anumite prelucrri ale datelor. S considerm cazul n care un utilizator dorete s mprumute o carte a unui anumit autor de la bibliotec. Dac toate crile autorului respectiv sunt deja mprumutate, butonul mprumut poate fi dezactivat. n aceast situaie, faptul c mprumutul este imposibil nu este reinut n Model, ci este determinat de Prezentator, care apoi i cere Vizualizrii s dezactiveze butonul respectiv. n abordarea Controlorului supervizor, Vizualizarea interacioneaz direct cu Modelul pentru a transfera date, fr intervenia Prezentatorului. Prezentatorul actualizeaz Modelul i manipuleaz starea Vizualizrii doar n cazurile n care exist o logic complex a interfeei cu utilizatorul. Vizualizarea poate fi actualizat i direct, pe baza modificrilor datelor din Model. Astfel de transferuri simple, n care Vizualizarea comunic direct cu Modelul, sunt n general situaiile n care se schimb unele date n Model iar acestea sunt preluate i afiate n Vizualizare, fr prelucrri suplimentare. De exemplu, interfaa afieaz o list de cri mprumutate de un student de la bibliotec, list pstrat de Model ntr-o baz de date. Cnd studentul mprumut o nou carte, baza de date se schimb iar Vizualizarea preia direct din Model elementele listei pentru afiare. Vizualizarea pasiv este asemntoare arhitecturii cu trei straturi tipice, n care stratul de logic a aplicaiei se interpune ntre stratul de prezentare i stratul de acces la date. Decizia asupra alegerii uneia din cele dou variante depinde de prioritile aplicaiei. Dac este mai important testabilitatea, Vizualizarea pasiv este mai potrivit, deoarece se poate testa toat logica interfeei cu utilizatorul prin testarea Prezentatorului. Pe de alt parte, dac simplitatea este mai important, Controlorul supervizor este o opiune mai bun deoarece, pentru schimbri mici n interfa, nu mai trebuie inclus cod n Prezentator pentru actualizarea Vizualizrii. Astfel, Controlorul supervizor necesit de obicei mai puin cod ntruct Prezentatorul nu mai efectueaz actualizrile simple ale Vizualizrii. abloanele MVC i MVP au scopuri similare, ns difer prin modalitile n care i ating aceste scopuri.
137
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C#

5. Aplicaii
5.1. Realizai un program de tip consol cu arhitectura MVP, Controlor supervizor pentru determinarea costurilor unei firme de transport. Se vor putea calcula costurile de transport ntre dou orae, identificate prin nume, latitudine i longitudine. Aplicaia va permite dou roluri: administrator i utilizator, cu funcii diferite (figura 6.4).

Figura 6.4. Meniul principal

Pentru rolul de utilizator comenzile disponibile sunt prezentate n figura 6.5.

Figura 6.5. Meniul rolului de utilizator


138
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC

Pentru rolul de administrator comenzile disponibile sunt prezentate n figura 6.6.

Figura 6.6. Meniul rolului de administrator

Indicaii: Se furnizeaz codul surs pentru Model, mpreun cu un fiier text care conine mai multe orae;

Model.cs
using System; using System.Collections.Generic; using System.IO; using System.Text; namespace TransportInfo { public class Model : IModel { #region Fields private const string CityFileName = "cities.txt"; private List<City> _cityList; private bool _wasModified; // lista cu orae va fi salvat n final doar dac s-a modificat #endregion

139
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C# #region Properties public int CityCount { get { return _cityList.Count; } } #endregion #region Constructor public Model() { _cityList = new List<City>(); _wasModified = false; } #endregion

#region Public Methods public int GetNumberOfCities() { return _cityList.Count; } public bool DataExists() { if (!File.Exists(CityFileName)) { _wasModified = true; return false; } else return true; } public void InitializeData() { StreamReader sr = new StreamReader(CityFileName); string line; while ((line = sr.ReadLine()) != null) _cityList.Add(ParseCityLine(line)); sr.Close(); }

140
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC public bool Add(City city) { // dac un ora cu acelai nume exist deja, el va fi ters bool overwrite = false; for (int i = 0; i < _cityList.Count; i++) { if (_cityList[i].Name.Trim().ToUpper() == city.Name.Trim().ToUpper()) { _cityList.RemoveAt(i--); overwrite = true; } } // adugarea noului ora _cityList.Add(city); _wasModified = true; return !overwrite; } public bool Delete(string cityName) { for (int i = 0; i < _cityList.Count; i++) { if (_cityList[i].Name == cityName) { _cityList.RemoveAt(i); _wasModified = true; return true; } } return false; } public bool Exists(string cityName) { // dac un ora exist for (int i = 0; i < _cityList.Count; i++) { if (_cityList[i].Name == cityName) return true; } return false; } 141
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C# public City Search(string cityName) { // caut un ora dup nume i returneaz obiectul corespunztor for (int i = 0; i < _cityList.Count; i++) { if (_cityList[i].Name == cityName) return _cityList[i]; } return new City(); } public string ListAll() { // creeaz un string cu numele tuturor oraelor if (_cityList.Count == 0) return string.Empty; StringBuilder sb = new StringBuilder(); sb.Append(_cityList[0].Name); for (int i = 1; i < _cityList.Count; i++) { sb.Append(", "); sb.Append(_cityList[i].Name); } return sb.ToString(); } /// <summary> /// Salveaz datele doar dac lista de orae s-a modificat /// </summary> /// <returns>Returneaz true dac noile date au fost salvate </returns> public bool SaveData() { // dac datele s-au modificat, ele sunt salvate if (_wasModified) { StreamWriter sw = new StreamWriter(CityFileName); for (int i = 0; i < _cityList.Count; i++) { City c = _cityList[i]; sw.WriteLine(c.Name + "\t" + c.Latitude + "\t" + c.Longitude); } 142
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC sw.Close(); return true; } else return false; } #endregion #region Private Methods private static City ParseCityLine(string line) { // citete informaiile unui ora de pe o linie din fiier string[] toks = line.Split('\t'); City city = new City(toks[0], Convert.ToDouble(toks[1]), Convert.ToDouble(toks[2])); return city; } #endregion } }

cities.txt
Iasi Bacau Piatra Neamt Suceava Botosani Vaslui Bucuresti Cluj-Napoca Timisoara Constanta Brasov Chisinau Balti Amsterdam Atena Belgrad Berlin Bruxelles Budapesta 47.167 46.567 46.933 47.667 47.733 46.633 44.44 46.78 45.76 44.18 45.66 47.033 47.75 52.383 37.967 44.817 52.533 50.85 47.483 27.583 26.917 26.383 26.183 26.667 27.733 26.1 23.59 21.23 28.63 25.61 28.833 27.917 4.9 23.767 20.45 13.4 4.35 19.083

143
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C# Londra Madrid Moscova Oslo Praga Paris Roma Sofia Viena 51.517 40.417 55.75 59.917 50.083 48.833 41.9 42.75 48.2 -0.1 -3.75 37.583 10.75 14.367 2.333 12.5 23.333 16.367

City.cs

Se furnizeaz codul surs pentru structura corespunztoare unui ora, mpreun cu funcia de calcul al distanei;

namespace TransportInfo { public struct City { // readonly pentru ca structura s fie immutable // alternativa este abordarea cu cmpuri private i proprieti publice public readonly double Latitude, Longitude; public readonly string Name; public City(string name, double latitude, double longitude) { Name = name; Latitude = latitude; Longitude = longitude; } } }

Calculator.cs
namespace TransportInfo { public class BusinessCalculator { #region Public Static Methods public static double Distance(City c1, City c2) { // calculeaz distana n kilometri ntre dou puncte de pe suprafaa Pmntului // identificate prin latitudine i longitudine utiliznd coordonate sferice double a1 = c1.Latitude * Math.PI / 180.0; 144
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC double b1 = c1.Longitude * Math.PI / 180.0; double a2 = c2.Latitude * Math.PI / 180.0; double b2 = c2.Longitude * Math.PI / 180.0; const double EarthRadius = 6378; // raza Pmntului n km return (int)(EarthRadius * Math.Acos(Math.Cos(a1) * Math.Cos(b1) * Math.Cos(a2) * Math.Cos(b2) + Math.Cos(a1) * Math.Sin(b1) * Math.Cos(a2) * Math.Sin(b2) + Math.Sin(a1) * Math.Sin(a2))); } public static double Cost(double distance) { // aici se poate introduce orice funcie de calcul al costului double euro = 5 + distance / 30.0; return euro * 4.3; } #endregion } }

ntruct cele trei meniuri au structuri similare, se recomand crearea unei metode comune care s primeasc drept parametru lista de opiuni posibile; Se recomand ca opiunile alese de utilizator s fie tratate ca o enumeraie.

public enum UserChoice { AdminMenu, UserMenu, PreviousMenu, Route, AddCity, RemoveCity, Exit, List, Undefined }; public enum MenuState { Main, Administrator, User };

Metoda Main din clasa Program poate avea coninutul urmtor:


static class Program { static void Main() { Model model = new Model(); ConsoleView view = new ConsoleView(model); Presenter presenter = new Presenter(view, model); view.SetPresenter(presenter); view.Start(); } }

145
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C#

146
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Figura 6.7. Exemplu de rezolvare: diagrama de clase

Capitolul 6. Arhitectura MVC

Un exemplu de diagram de clase pentru aplicaie este prezentat n figura 6.7. Pentru creterea claritii, nu s-au mai reprezentat explicit relaiile de asociere pentru cmpurile de tip IPresenter, IModel, IView i nici numele metodelor din interfee implementate de clasele concrete. Metoda ListAll din clasele View apeleaz direct metoda ListAll din clasa Model. Aici apare diferena ntre abordarea Controlorului supervizor i cea a Vizualizrii pasive. Dac s-ar fi utilizat cea de a doua abordare, ListAll din View ar fi apelat o metod corespunztoare din Presenter, iar aceasta ar fi apelat metoda ListAll din Model. Proiectele soluiei i fiierele surs pot fi structurate ca n figura 6.8.

Figura 6.8. Exemplu de rezolvare: structurarea soluiei

5.2. Tem pentru acas. Pstrnd aceleai clase pentru Model i Prezentator, realizai o Vizualizare nou, cu o interfa grafic de tip Windows Forms, cu aceeai funcionalitate ca i aplicaia consol dezvoltat anterior. Indicaii: Metoda Main din clasa Program poate avea coninutul urmtor:

147
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C# static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Model model = new Model(); FormView view = new FormView(); Presenter presenter = new Presenter(view, model); view.SetModel(model); view.SetPresenter(presenter); Application.Run(view); } }

Pentru a fora utilizatorul s foloseasc doar opiunea de Ieire pentru a nchide programul, butonul de nchidere a ferestrei poate fi dezactivat cu ajutorul secvenei urmtoare de cod:
#region Disable Close X Button const int MF_BYPOSITION = 0x400; [DllImport("User32")] private static extern int RemoveMenu(IntPtr hMenu, int nPosition, int wFlags); [DllImport("User32")] private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); [DllImport("User32")] private static extern int GetMenuItemCount(IntPtr hWnd); private void FormView_Load(object sender, EventArgs e) { IntPtr hMenu = GetSystemMenu(this.Handle, false); int menuItemCount = GetMenuItemCount(hMenu); RemoveMenu(hMenu, menuItemCount - 1, MF_BYPOSITION); } #endregion

Un exemplu de interfa grafic este prezentat n capturile ecran din figurile 6.9, 6.10 i 6.11.

148
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Capitolul 6. Arhitectura MVC

Figura 6.9. Exemplu de rezolvare: meniul principal

Figura 6.10. Exemplu de rezolvare: rolul de utilizator

149
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

Florin Leon Aplicaii de ingineria programrii n C#

Figura 6.11. Exemplu de rezolvare: rolul de administrator

150
Florin Leon (2012). Aplicatii de ingineria programarii in C#, Tehnopress, Iasi, ISBN 978-973-702-909-6 http://florinleon.byethost24.com

S-ar putea să vă placă și