Modul 9 - Lekcija 1
Evolucija platforme, Cross-platform podrška i Dependency Injection arhitektura
⏱️ Trajanje: ~3 časa | 📚 Nivo: Srednji | 🎯 Praktični primjeri: 4
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.
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!
| 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 |
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"
}
}
}
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
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;
}
}
Kada registrujemo servis, moramo odrediti koliko dugo on "živi" u memoriji sistema:
Kao "jednokratna maramica". Svaki put kad neko (klasa, kontroler, drugi servis) zatraži ovaj servis, dobije potpuno novu instancu.
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.
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.