MODUL 9 - LEKCIJA 1

.NET Framework vs .NET Core

Razlike, Dependency Injection i priprema za moderni .NET

⏱️ Trajanje: ~3 časa 📚 Nivo: Srednji 🎯 Praktični primjeri: 4

📖 Uvod u evoluciju .NET-a

Platforma .NET je prošla kroz značajnu transformaciju tokom godina. Za studente i buduće softverske inženjere, jako je važno razumjeti zašto je Microsoft odlučio napraviti potpuni preokret i preći sa .NET Frameworka na .NET Core (i kasnije samo .NET).

💡 Historijski kontekst:
.NET Framework je nastao 2002. godine. Bio je zatvorenog koda (closed-source) i monopolistički vezan isključivo za Windows operativne sisteme i Microsoft IIS web server. Kako su open-source alati i cloud okruženja (koja često koriste i Linux) postajali dominantni, .NET Framework je postajao ograničavajući faktor.

.NET Core je predstavljen 2016. godine. Predstavlja potpuno novu, "iz temelja" napisanu arhitekturu, koja je u potpunosti otvorenog koda (open-source) i cross-platform (radi na Windows, Linux i macOS sistemima). Od verzije .NET 5, izbačena je riječ "Core" pa se framework naziva samo ".NET".

🔄 Ključne Razlike (Detaljna Analiza)

Ova evolucija nije donijela samo podršku za Linux, već duboke arhitektonske promjene i ogromna poboljšanja performansi. U narednoj tabeli možemo sumirati te promjene:

Karakteristika .NET Framework (Stari model) .NET Core / .NET (Moderni model)
Platforma (OS) Samo Windows Windows, Linux, macOS (Cross-platform)
Kôd i Licenca Proprietaran (Zatvoren kôd) Open Source (Otvoren kôd na GitHub repozitoriju)
Hostovanje (Web Server) Snažno ovisan o IIS-u i integriran u Windows Ugrađen Kestrel server (može raditi samostalno, iza Nginxa, Apachea ili IIS-a)
Performanse Dobre, ali sa velikim opterećenjem zbog naslijeđenog koda i monolitne strukture Ekstremno brz, modularan, mala potrošnja RAM memorije (redovno na vrhu testova performansi na svijetu)
Konfiguracija Web.config (Složeni XML fajlovi) appsettings.json (Laki JSON fajlovi i sistemske varijable)
Dependency Injection (DI) Nije bio ugrađen. Često su se morale uvoditi kompleksne eksterne biblioteke. Ugrađen u samo srce frameworka (prvoklasni građanin). Interfejsi su u prvom planu.

1. Arhitektura i Modularnost: Odbacivanje fajla System.Web

U starom .NET Frameworku, okosnica ASP.NET-a bila je biblioteka zvana System.Web.dll, direktno u dogovoru sa IIS serverom (dio operativnog sistema). Ta biblioteka je učitavala veoma velik broj klasa i modula u memoriju aplikacije pri njenom pokretanju, čak i za funkcionalnosti koje uopće i nećete koristiti. Ovo se naziva teški monolitni arhitektonski dizajn.

.NET Core je ovo promijenio, posjedujući vlastiti brzi lokalni web server koji se naziva Kestrel. Danas svaka ASP.NET Web aplikacija kreće kao "obična Console (Konzolna) aplikacija" unutar koje se pali Kestrel web server da sluša HTTP Request-ove. Koncept je takav da je aplikacija "prazna", a sve ono što vama treba (npr. podrška za MVC strukturu, podrška za bazu, CORS) dodajete isključivo izdavanjem naredbi tokom pokućanja unutar takozvanog Middleware pipeline-a. Rezultat toga je da su Docker Image-i izrazito male veličine, efikasni na resursima i dozvoljavaju da vaša platforma skalira neusporedivo lakše nego prije.

2. Upravljanje Konfiguracijom: Web.config naspram appsettings.json

Rad s konfiguracijama i konekcijama nekada znao biti zastrašujuće spor. Upisivalo bi se desetine linija u komplikovane XML strukture Web.config fajlova. Moderan je pristup donio osvježenje primjenom čistog JSON formata.

Stari Način: Web.config (XML)
<configuration>
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=ServerName;Initial Catalog=DB_Name;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>
  <!-- Često su postojale ogromne količine slične strukture -->
</configuration>
Moderni Način: appsettings.json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=DB_Name;Trusted_Connection=True;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

Dobar savjet: U modernom ASP.NET-u konfiguracije iz appsettings.json možete jednostavno automatski mapirati na C# Klase koristeći poznati "Options pattern", pa nikada ne tražite postavke pomoću ručnih putanji po sistemu, nego objektno, u okviru C# koda aplikacije.

3. Inicijalizacija Aplikacije: Global.asax vs Program.cs

Inicijalizacija starih aplikacija često se vrtjela oko klasa iz skrivenih događaja u Global.asax.cs. Bilo je tu mnogo nevidljive i komplicirane magije unutar Application_Start metode. Moderne platforme (u ovom slučaju verzije .NET 6+) koriste Top-level statements za direktno otvaranje i inicijaliziranje aplikacije.

Stari ASP.NET MVC: Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
    // Kada server podigne aplikaciju magično poziva metodu
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes); // Podešavanje sistema ruta
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}
Moderni .NET (Core / 6+): Program.cs
var builder = WebApplication.CreateBuilder(args);

// 1. FAZA: Konfiguracija Servisa i injekcije
builder.Services.AddControllersWithViews(); // Pali se podrška za iscrtavanje MVC elemenata
// builder.Services.AddScoped<IMinistryService, MinistryService>();

var app = builder.Build();

// 2. FAZA: Middleware pipeline - Važan je redoslijed izvršavanja (po redu)
app.UseStaticFiles();   // Server dopušta pregled CSS-a, JavaScript fajlova i Slika
app.UseRouting();       // Prepoznavanja HTTP ruta iz adrese preko Kestrela
app.UseAuthorization(); // Siguronosne provjere korisnika prije davanja stranice

// Definisanje podrazumjevane rute kao na klasičnom MVC-u
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run(); // Paljenje aplikacije

4. Ugrađeni Dependency Injection (DI) koncept

Ovo je arhitektonski najvažnija razlika za inženjere u obavljanju svakodnevnih operativnih zadataka. U starijim periodima i projektima, kontroleri su posjedovali tvrdu instancu za kreiranje objekata koda unutar svojih metoda (pisanjem sintakse komande new MojaBazaPodataka() ili slično). Ovaj anti-patern čvrstog spajanja kodova zove se tight-coupling, onemogućavao je elegantno i lako jedinično testiranje samih klasa jer ih je bilo nemoguće simulirati (praviti mockove).

.NET Core je postavio sistem "Dependency Injection" (Ubacivanja zavisnosti) u samo središte poslovanja alata. Svi moduli objašnjavaju svoje potrebe na papiru (uglavnom pomoću Interface definicije). A Framework garantuje dostavljanje objekta svakom kontroleru preko argumenta njegovog konstruktora.

🛠️ DI: Injectanje servisa (U .NET Core / 5+)
// 1. KORAK - Pri pokretanju aplikacije u Program.cs govorimo sistemu o našim klasama:
// Metoda AddScoped znači: Instanciraj 'MinistryService' iznova po svakom HTTP Zahtjevu.
builder.Services.AddScoped<IMinistryService, MinistryService>();

// 2. KORAK - Controller rad i Constructor Injection procedura
public class MinistryController : Controller
{
    // Samo interfejs
    private readonly IMinistryService _service;
    
    // Framework AUTOMATSKI poziva ovaj konstruktor pri otvaranju stranice 
    // i Ugrađeni sistem (DI kontejner) dostavlja valjan i svjež 'MinistryService' na poklon.
    public MinistryController(IMinistryService service)
    {
        _service = service;
    }

    public ActionResult Index()
    {
        // Kontroler nikada nije kreirao servis direktno ali ga sasvim uredno poziva iz svoje memorije!
        var ministries = _service.GetAll();
        return View(ministries);
    }
}

✅ Zaključak

Što se tiče modernog ekosistema web razvoja i integracija softvera sa Cloud (Oblak) platformama, prelazak sa limitiranog originalnog .NET Framework arhiva na novi moderni .NET (Core) arhitekturalni sistem predstvalja i dalje jedan od najuspješnih "restruktuiranja i inžinjerskih modernizacija" aplikacija tehnološkog giganta u historiji programiranja.

Kao moderni web i backend softwerski inžinjeri, danas imate pristup jednom od generalno najsnažnijih operativnih i izvršnih alata za stvaranje masovnih web arhitektura, te znanje da staromodna konfiguraciona ograničenja Windows platforme, kao i Dependency vezivanja, više nisu i nikada vjerovatno neće ponovo biti problem razvoja unutar .NET okruženja.