Ecosistemul .NET este mult mai mult decât un simplu limbaj de programare; este un cadru de lucru robust, open-source și cross-platform, dezvoltat de Microsoft, care permite crearea de aplicații diverse, de la site-uri web complexe la servicii cloud scalabile. În practică, domină piața enterprise datorită performanței ridicate, securității native și a unui suport excelent pentru integrare cu alte tehnologii. A înțelege ce poți construi cu .NET este esențial pentru a alege arhitectura potrivită și a te integra rapid în echipe profesionale care folosesc acest stack tehnologic.
Concepte cheie
- ASP.NET Core: Framework-ul standard pentru construirea de API-uri RESTful și aplicații web moderne, fiind extrem de rapid și optimizat pentru microservicii.
- .NET MAUI: Soluția oficială pentru dezvoltarea de aplicații mobile native (iOS, Android) și desktop, permițând scrierea unei singure codebases pentru multiple platforme.
- Entity Framework Core: Un ORM (Object-Relational Mapper) puternic care simplifică interacțiunea cu bazele de date, mapând obiectele C# direct la tabelele SQL.
- Blazor: O tehnologie care permite scrierea logicii frontend în C#, eliminând necesitatea de a scrie JavaScript complex pentru anumite tipuri de aplicații interactive.
- Dependency Injection: Un pattern nativ în .NET care facilitează testarea și menținerea codului prin injectarea dependențelor necesare claselor, nu prin crearea lor internă.
- Async/Await: Mecanismul asincron integrat în limbaj care permite aplicațiilor să rămână responsive în timp ce așteaptă operațiuni I/O, cum ar fi apeluri de bază de date.
- Minimal APIs: O abordare ușoară pentru crearea de endpoint-uri HTTP rapide, ideală pentru microservicii simple fără overhead-ul unui controller MVC clasic.
Exemplu practic
Să presupunem că trebuie să construiești un serviciu backend simplu pentru o listă de produse. Folosind ASP.NET Core Minimal APIs, poți crea un endpoint GET în câteva linii de cod.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/products", () =>
{
// Simulare date din baza de date
return new List<string> { "Laptop", "Mouse", "Keyboard" };
});
app.Run();
Acest exemplu demonstrează cât de rapid poți avea un server funcțional. Într-un scenariu real, ai conecta List<string> la un context Entity Framework Core pentru a prelua datele reale din SQL Server sau PostgreSQL, adăugând totodată gestionarea erorilor și validarea input-ului.
Greșeli frecvente
- Ignorarea asincronismului: Să folosești metode sincron (
Wait()sau.Result) în loc deawaitblochează thread-urile, reducând drastic capacitatea de procesare a serverului. - Leaking Connections: Deschiderea conexiunilor la baza de date fără a le închide corect (folosind
usingsau DI) duce la epuizarea pool-ului de conexiuni și crash-uri ale aplicației. - Over-engineering: Construirea unei arhitecturi complexe cu multe straturi pentru o cerință simplă, când un Minimal API sau un controller simplu ar fi fost suficient.
- Hardcodarea configurațiilor: Stocarea cheilor API sau a stringurilor de conexiune direct în cod, în loc să folosești variabile de mediu sau
appsettings.json.
Întrebări de interviu
- Care este diferența dintre .NET Framework și .NET Core? Răspuns: .NET Framework este legacy, doar Windows și monolitic. .NET Core (acum .NET 5+) este cross-platform, modular, open-source și cu performanță superioară.
- De ce este important Dependency Injection în .NET? Răspuns: Scade cuplajul între clase, face codul mai ușor de testat (mocking) și respectă principiul Single Responsibility.
- Ce face atributul
[ApiController]? Răspuns: Activează automat validarea modelului (returnează 400 Bad Request dacă datele sunt invalide) și anumite comportamente specifice API-urilor.
Exercițiu
Construiește o aplicație console în C# care simulează un manager de task-uri simplu. Creează o clasă TaskManager cu o metodă AddTask(string title) care salvează task-urile într-o List<string>. Adaugă o metodă DisplayAllTasks() care afișează lista. În metoda Main, instantiază clasa, adaugă 3 task-uri și afișează-le. Scopul este să exersezi manipularea colecțiilor și structura de bază a unei clase, pregătindu-te pentru entități mai complexe în viitor.