.NET Framework vs .NET Core

Modul 9 - Lekcija 1

Evolucija platforme, Cross-platform podrška i Dependency Injection arhitektura

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

📖 Evolucija (Mrtva ptica i Fenix 🦅)

Stari Okovi i Microsoft IIS Monopol

Stari .NET Framework (2002) bio je snažan okov. Sklopljen isključivo ugovorom s Windows operativnim sistemom, bio je glomazan, proprietary, monolitan sistem koji se poigravao sa teškim sistemskim memorijama na IIS Serverima.

Ponovno rađanje u Open-Source obliku

Moderni .NET Core (2016+) i sad samo .NET (2020+) napravio je zaokret od 180 stepeni. Potpuno prekreiran iz nule s obzirom na tekturu novog doba postavljen je na GitHub kao Open Source te osposobljen da funkcioniše na Linux/Docker i MacOS mašinama!

🔄 Usporedba Doba

Karakteristika .NET Framework (Stari model) .NET Core / .NET (Moderni model)
OS Podrška Skulptura striktno za Windows operativne sisteme Windows, Linux (Ubuntu..), macOS (Cross-platform)
Hostovanje Snažno ovisan o IIS-u Ugrađen lagani Kestrel server. Samostalna konzola.
Konfiguracija Zastarjeli i neshvatljivi XML formati unutar Web.config Programerski elegantni appsettings.json formati
Dependency Injection Slobodan pad. Nema nativne podržke u startu Kičma Core okvira, centralna lozinka funkcionisanja cijele arhitekture weba

📁 Konfiguracioni Parametri (.json vs .config)

Postavke servera, Imena Servera i passworde baze vise NE SMIJEMO upisivati u kontrolere ili u prljave ružne XML fajlove koji su preteški za parsirat!


<configuration>
  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=ServerName;Initial Catalog=DB_Name;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>
/* NOVI NAČIN: appsettings.json */
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=DB_Name;Trusted_Connection=True;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}

⚡ Arhitektura Podizanja: Program.cs vs Global.asax

Moderni ekosustav gura priču u takozvani Middleware Pipeline, lanac koji obavija i kontroliše aplikatne tokove HTTP-a čitajući Top-Level-Statement red po red Program.cs fajla umjesto magičnih automatskih Application_Start() Cikli!

// MODERN ASP.NET (Core) Setup u Program.cs //

var builder = WebApplication.CreateBuilder(args);
// OVDJE U SERVISE (MEMORIJU APLIKACIJE) BAZIRAMO SVOJE MOGUCNOSTI
builder.Services.AddControllersWithViews(); 

var app = builder.Build(); // KONSTRUISALI SMO WEB SAJT

// A SAD DA MU KAZEMO STA DA OCEKUJE, I TO REDOSLIJEDOM: P I P E L I N E (!!!)
app.UseStaticFiles();   // Očekuj pristupanje Tvojim css Slikama fajlavima na Folderu Root
app.UseRouting();       // Pali Prepoznavanja RUTA od strane servera /Ustanove/Edit

app.UseAuthorization(); // Dozvoli Prijave, ne pusta svakog tek onako
app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}"); // Defaulruta ista

app.Run(); // KRECI

💉 DI: Dependency Injection (Ubrizgavanje Zavisnosti)

Ukoliko kontroler kreira objeka new SqlConnection() on postaje rob i taoc te implementacije onemogućavajući kvalitetno testiranje lažnih baza podataka!

U Core sistemu kontroleri Obećaju interfejs a Program.cs im pri pogledu kroz Browser Ubrizga ("Inject"uje) Obećani Objekat kroz rupu na konstruktoru klasa!

// Program.cs :
// Nauči ASP aplikaciju ako neko trazi IMinistryService uleti mu pravu Klasu svjezžu (Scoped)! 
builder.Services.AddScoped<IMinistryService, MinistryService>();

// Controllers :
public class MinistryController : Controller
{
    private readonly IMinistryService _service;
    
    // NEMA "new", APLIKACIJA AUTPMATSI DOSTAVLJA IZ DI KONTEJNERA SVOJE KLASE PREMA POTREBAMA!
    public MinistryController(IMinistryService service)
    {
        _service = service;
    }
}

⏳ Životni vijek Servisa (Trajanje)

Kada registrujemo servis, moramo odrediti koliko dugo on "živi" u memoriji sistema:

Transient

Kao "jednokratna maramica". Svaki put kad neko (klasa, kontroler, drugi servis) zatraži ovaj servis, dobije potpuno novu instancu.

Scoped

Kao "dnevna karta". Unutar jednog HTTP zahtjeva (od klika u browseru dok ne dobiješ odgovor), svi koji traže ovaj servis dobiće istu instancu. Čim završi taj request, instanca se briše.

Singleton

Kao "kancelarijski inventar". Kreira se jednom kada se aplikacija pokrene i svi korisnici (i svi requesti) dijele tu jednu te istu instancu dok se server ne ugasi.

✅ Zaključak

  • ✅ Stari .NET Framework je tehnološki dinosurus baziran na windows-monopol politici, IIS teškim XML fajlovima i nefleksibilnoj "System.Web" arhitektonici.
  • .NET Core (.NET) donosi Kestrel Console-App hostove, Multi-os podrške i nevjerovatan performans sa smanjenom RAM Potrošnjom!
  • ✅ Centralizirani princip Dependency Injection-a (DI) oslobađa klase od tvrdog vezivanja za instanciranje koda dopustajući vam lagane Switch-eve baze podataka ili drugih repozitorija podataka sa vrlo minimalnim programerskim otiscima i ulaženjem u kodne fajlove Modela!