În ultimii ani s-au putut observa schimbări majore ale principiilor care stau la baza dezvoltării de software: un ritm rapid al inovației și al lansării de aplicații, accentul pus pe strategii de dezvoltare pentru multiple dispozitive, respectiv colaborarea din cadrul comunităților de dezvoltatori bazată tot mai mult pe open source. La acestea se adaugă și nevoia dezvoltatorilor de a integra aplicațiilor vechi la noi tehnologii. Microsoft a încercat să găsească un răspuns la toate aceste cerințe prin stabilirea unei noi direcții a framework-ului său binecunoscut .NET, direcție care poartă numele generic vNext.
În cadrul conferinței TechEd de anul acesta, Microsoft a prezentat viitoarea versiune a framework-ului .NET intitulată vNext, care a evoluat ca o soluție firească înspre a acomoda toate cerințele actuale ale dezvoltatorilor. Mai exact, se dorește ca toate schimbările să aducă modul de realizare al aplicațiilor la un alt nivel.
vNext însumează o serie de modificări aduse platformei .NET. Acestea implică: modularizare ridicată, tranziție ușoară a aplicațiilor către cloud, facilitarea contribuțiilor la framework prin cod open source, un ciclu rapid de dezvoltare, libera alegere a tool-urilor de programare, și nu în ultimul rând libera alegere a platformei pe care pot rula aplicațiile. În acest context, întrebările pe care mulți și le adresează sunt cum se concretizează mai exact vNext în cadrul procesului de dezvoltare și ce facilități aduce acesta la nivelul tool-urilor?
Una dintre modificările majore aduse platformei .NET este modularizarea totală. Până acum, era necesară instalarea globală a framework-ului .NET pe mașina pe care trebuiau rulate aplicațiile. Aceasta presupune alocarea unui spațiu mărit pe disc. De asemenea, apar probleme în cazul în care se dorește rularea unei aplicații cu o altă versiune de .NET decât cea existentă, aceasta presupunând schimbarea versiunii globale a framework-ului pe mașina respectivă, lucru care poate afecta toate programele existente. Toate acestea duc la un timp sporit pentru setarea aplicațiilor pe un anumit mediu.
vNext aduce organizarea funcționalităților sub forma de pachete. Așadar, toate dependențele unei aplicații (inclusiv framework-ul, Common Language Runtime) sunt constituite ca pachete Nuget care se desfășoară simultan cu aplicația. De asemenea, pentru a optimiza resursele aplicațiilor cloud, Microsoft a decis separarea framework-ului în două variante: una pentru soluțiile on-premise, respectiv una pentru aplicații cloud. Varianta vNext optimizată pentru cloud conține doar acele resurse care sunt strict necesare pentru desfășurarea unei aplicații în cloud și nimic altceva. Așadar, această variantă a framework-ului nu conține referințele necesare pentru Windows Forms sau Windows Presentation Foundation.
Modularizarea framework-ului se reflectă în următoarea versiune a IDE-ului Visual Studio care aduce un nou mod de structurare a soluțiilor. S-a renunțat la listarea referințelor în forma lineară; acum, acestea sunt dispuse în formă arborescentă astfel încât să ofere o imagine mult mai clară asupra dependențelor, fie ele pachete Nuget sau librării de clase. De asemenea, dacă optăm pentru o aplicație web, primul lucru care se poate observa în IDE este absența fișierului Web.config. Pe de altă parte, s-a introdus un nou fișier denumit project.json care este prezent pentru toate tipurile de proiecte. Fișierul project.json joaca un rol esențial în configurarea aplicațiilor vNext. Acesta conține lista de dependențe ale proiectului, definirea de comenzi custom, respectiv setări pentru diverse configurații. Visual Studio oferă suport Intellisense pentru editarea acestui fișier și pentru căutarea referințelor. De asemenea, dependențele specificate în fișier se sincronizează în timp real cu arborele de referințe vizibil în Solution Explorer.
"dependencies": {
"EntityFramework.SqlServer": "7.0.0",
"Microsoft.AspNet.Mvc": "6.0.0",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0",
"Microsoft.AspNet.Identity.Authentication": "3.0.0",
"Microsoft.AspNet.Security.Cookies": "1.0.0",
"Microsoft.AspNet.Server.IIS": "1.0.0-*",
"Microsoft.AspNet.Server.WebListener": "1.0.0-*",
"Microsoft.AspNet.StaticFiles": "1.0.0",
"Microsoft.Framework.ConfigurationModel.Json": "1.0.0",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0-*",
"UserManagement.BusinessLogic": ""
},
"commands": {
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000"
},
"configurations": {
"net451" : { },
"k10" : { }
}
Fișierul json reprezintă o resursă extrem de puternică. Dezvoltatorul poate opta fie pentru o anumită versiune a unui pachet, fie pentru ultima versiune. Acest lucru se dovedește foarte util, deoarece se pot încărca în proiect cele mai noi versiuni ale pachetelor care conțin de multe ori fixuri pentru buguri din versiunile precedente. Mai mult decât atât, dacă se depistează bug-uri în cadrul unor pachete open source, acestea pot fi clonate pe mașina locală, fixate, pentru ca apoi referințele lor din pachet să poată fi actualizate pentru a indica noua versiune ce conține fixurile.
Pe lângă specificarea dependențelor, fișierul project.json poate fi folosit pentru reconstituirea completă a soluției în Visual Studio, în cazul ștergerii accidentale a fișierelor .proj din aplicație.
Viitoarea direcție a framework-ului .NET aduce în prim plan conceptul de Dependency Injection, care devine un mecanism built in de setare a aplicațiilor. Aceasta configurare se realizează în clasa Startup
, în cadrul metodei Configure
, ilustrată mai jos:
public void Configure(IBuilder app)
{
// Setup configuration sources
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
configuration.AddEnvironmentVariables();
string connString = configuration.Get("Data:DefaultConnection:ConnectionString");
// Set up application services
app.UseServices(services =>
{
// Add EF services to the services container
services.AddEntityFramework().AddSqlServer();
// Configure DbContext
services.SetupOptions<DbContextOptions>(options =>
{ options.UseSqlServer(configuration.Get("Data:DefaultConnection:ConnectionString"));
});
// Add Identity services to the services container
services.AddIdentity<ApplicationUser>()
.AddEntityFramework<ApplicationUser, ApplicationDbContext>()
.AddHttpSignIn();
// Add MVC services to the services container
services.AddMvc();
});
// Add MVC to the request pipeline
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
routes.MapRoute(
name: "api",
template: "{controller}/{id?}");
});
}
Așa cum se poate observa, se oferă un control sporit și se permite setarea explicită doar a funcționalităților necesare. Este foarte important ca serviciile folosite să fie înregistrate în fișierul de configurare json. În secțiunea precedentă s-a menționat lipsa fișierului Web.config din aplicațiile web. Aceasta se datorează faptului că developer-ul are posibilitatea de a alege propriul mod de specificare a configurației: prin fișiere xml, json sau ini. Bineînțeles, acest lucru se realizează tot în cadrul metodei Configure
, prin setarea fișierului ales ca referință în cadrul obiectului configuration
.
Tot în această metodă, se specifică dacă se dorește includerea Entity Framework sau MVC în proiect, de exemplu. Aceasta se face prin apelarea metodelor de forma AddEntityFramework
sau AddMvc
. Mai mult decât atât, se pot seta anumiți parametri ale funcționalităților incluse (prin metodele de forma UseEntityFramework
sau UseMvc
), cum ar fi configurarea rutelor în MVC.
Cu toate că există multe mecanisme 3rd party pentru dependency injection în .NET (Autofac, NInject), se oferă de acum și suport built in pentru aceasta, ceea ce permite un control mult mai granular al serviciilor foloste în cadrul aplicației. În cazul în care se dorește folosirea unui container 3rd party pentru Dependency Injection, se poate realiza asta prin specificarea dependenței în project.json urmată de setarea explicită a parametrilor în metoda Configure
.
Un alt avantaj important care este inclus în aplicațiile vNext și nu numai este compilarea dinamică. Noua platforma de compilatoare .NET cunoscută sub numele Roslyn, oferă un API public open-source. Având la îndemână API-urile compilatoarelor .NET, dezvoltatorii pot crea de acum mai ușor aplicații pentru analiza codului, diagnosticări customizate inclusiv versiuni optimizate de compilatoare.
Din moment ce are loc în memoria sistemului și nu presupune rescrierea assembly-urilor pe disc, compilarea dinamică aduce un spor de performanță execuției unui program. Așadar, odată ce este pornit procesul aplicației, se poate edita codul sursă și doar prin simpla sa salvare, putem vedea modificările făcute în timp real. De remarcat este faptul că nu e necesar pasul de rebuild al programului, care necesită timp și resurse, ci doar salvarea fișierelor modificate. De exemplu, cei care creează o aplicație web trebuie doar să editeze codul sursă și să tasteze F5 în browser pentru a-și vedea schimbările propagate. Aceasta duce la un ciclu mult mai rapid al implementării aplicațiilor și al fixărilor de defecte, mărind astfel productivitatea tuturor dezvoltatorilor.
Inovațiile aduse odată cu vNext nu se opresc doar aici. Printre alte noutăți se numără unificarea Web Pages, MVC și Web API într-un singur model, sau suportul îmbunătățit pentru Mono pentru portarea aplicațiilor pe alte platforme. Prin toată această modularizare menționată mai sus și prin controlul sporit, se dorește ca deploierea și mentenanța aplicațiilor să se realizeze mult mai ușor pe orice mediu. Aplicațiile vor putea fi rulate inclusiv de pe mediile portabile cum sunt stickurile de memorie. Mai mult decât atât, aceeași aplicație va putea fi rulată simultan pe versiuni diferite ale framework-ului.
Nu în ultimul rând, vNext marchează intrarea framework-ului .NET într-o noua eră, una care permite libertatea deplină a dezvoltatorilor de a-și alege propriile tool-uri și sisteme de operare. Fiind open-source, toată comunitatea are mereu acces la ultimele funcționalități ale vNext, iar dezvoltarea acestuia se realizează printr-un proces de feedback continuu. Viitoarea versiune a framework-ului .NET promite că va revoluționa procesul de implementare, iar nouă nu ne rămâne decât să așteptam lansarea sa oficială pentru a explora toate facilitățile oferite de acesta.