ASP.NET Core Web API i baza podataka: Entity Framework Core
Lekcija 4 od 7 · ASP.NET Core
Proizvodi se sada čuvaju u bazi podataka. Koristimo Entity Framework Core (EF Core) – ORM koji C# klase pretvara u tabele, a LINQ upite u SQL. Za učenje je dovoljan SQLite (baza u jednom fajlu, bez instalacije servera); prelazak na SQL Server je promena jednog reda.
Pre nego što počneš: potrebno predznanje – Web API kontroleri, isti pojmovi u Django-u (za poređenje). Kako da učiš: radi u svom projektu korak po korak i posle svake izmene pokreni aplikaciju; zadatak na kraju prvo uradi sam/a. Kod je u C#-u za .NET 8 ili noviji (preporuka: aktuelna LTS verzija); naziv fajla je u komentaru na vrhu svakog primera.
Paketi se preuzimaju sa NuGet-a i upisuju u Prodavnica.csproj. Glavni broj verzije EF Core-a treba da odgovara verziji .NET-a – za projekat na .NET 8 dodaj --version 8.*.
DbContext: veza sa bazom
// Data/ProdavnicaContext.cs
using Microsoft.EntityFrameworkCore;
using Prodavnica.Models;
namespace Prodavnica.Data;
public class ProdavnicaContext(DbContextOptions<ProdavnicaContext> options) : DbContext(options)
{
public DbSet<Proizvod> Proizvodi => Set<Proizvod>(); // tabela Proizvodi
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// početni podaci – upisuju se migracijom
modelBuilder.Entity<Proizvod>().HasData(
new Proizvod { Id = 1, Naziv = "Sveska", Cena = 120, Kolicina = 50 },
new Proizvod { Id = 2, Naziv = "Olovka", Cena = 60, Kolicina = 200 },
new Proizvod { Id = 3, Naziv = "Lenjir", Cena = 150, Kolicina = 30 });
}
}
// Program.cs – Web API + baza (lekcija 4) + statičke strane (lekcija 5)
using Microsoft.EntityFrameworkCore;
using Prodavnica.Data;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<ProdavnicaContext>(opcije =>
opcije.UseSqlite(builder.Configuration.GetConnectionString("Prodavnica")));
var app = builder.Build();
app.UseHttpsRedirection();
app.UseDefaultFiles(); // lekcija 5: "/" → wwwroot/index.html
app.UseStaticFiles(); // lekcija 5: fajlovi iz wwwroot
app.MapControllers();
app.Run();
AddDbContext registruje bazu kao servis. Kontroler je dobija kroz konstruktor – to se zove ubrizgavanje zavisnosti (dependency injection): kontroler ne pravi vezu sa bazom sam, nego je traži, a ASP.NET Core je daje.
Migracije: od klase do tabele
dotnet ef migrations add Pocetna
dotnet ef database update
Prva komanda pravi folder Migrations sa opisom tabele, a druga pravi fajl prodavnica.db i upisuje početne podatke. Kada promeniš model (npr. dodaš svojstvo), ponovi obe komande sa novim imenom migracije. Bazu možeš pregledati alatom DB Browser for SQLite ili dodatkom za VS Code.
Kontroler koji radi sa bazom
// Controllers/ProizvodiController.cs – podaci iz baze (lekcija 4)
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Prodavnica.Data;
using Prodavnica.Models;
namespace Prodavnica.Controllers;
[ApiController]
[Route("api/[controller]")]
public class ProizvodiController(ProdavnicaContext db) : ControllerBase // baza stiže kroz konstruktor
{
[HttpGet]
public async Task<List<Proizvod>> Svi() =>
await db.Proizvodi.OrderBy(p => p.Naziv).ToListAsync();
// GET /api/proizvodi/pretraga?q=ol
[HttpGet("pretraga")]
public async Task<List<Proizvod>> Pretraga(string q) =>
await db.Proizvodi.Where(p => p.Naziv.Contains(q)).ToListAsync();
[HttpGet("{id:int}")]
public async Task<ActionResult<Proizvod>> Jedan(int id)
{
var p = await db.Proizvodi.FindAsync(id);
if (p == null) return NotFound();
return p;
}
[HttpPost]
public async Task<ActionResult<Proizvod>> Dodaj(Proizvod novi)
{
novi.Id = 0; // id dodeljuje baza
db.Proizvodi.Add(novi);
await db.SaveChangesAsync(); // INSERT
return CreatedAtAction(nameof(Jedan), new { id = novi.Id }, novi);
}
[HttpPut("{id:int}")]
public async Task<IActionResult> Izmeni(int id, Proizvod izmenjen)
{
var p = await db.Proizvodi.FindAsync(id);
if (p == null) return NotFound();
p.Naziv = izmenjen.Naziv;
p.Cena = izmenjen.Cena;
p.Kolicina = izmenjen.Kolicina;
await db.SaveChangesAsync(); // UPDATE
return NoContent();
}
[HttpDelete("{id:int}")]
public async Task<IActionResult> Obrisi(int id)
{
var p = await db.Proizvodi.FindAsync(id);
if (p == null) return NotFound();
db.Proizvodi.Remove(p);
await db.SaveChangesAsync(); // DELETE
return NoContent();
}
}
EF Core / LINQ
SQL (otprilike)
db.Proizvodi.ToListAsync()
SELECT * FROM Proizvodi
.Where(p => p.Naziv.Contains(q))
WHERE instr(Naziv, @q) > 0
.OrderBy(p => p.Naziv)
ORDER BY Naziv
FindAsync(id)
SELECT … WHERE Id = @id
Add / izmena / Remove + SaveChangesAsync()
INSERT / UPDATE / DELETE
async/await: dok čeka bazu, server ne „stoji“ nego obrađuje druge zahteve. EF Core uvek šalje vrednosti kao parametre, pa je otporan na SQL injekciju (Bezbednost). U SQLite-u je Contains osetljiv na velika i mala slova.
Program.cs i ostali zahtevi iz .http fajla ostaju isti – promenio se samo način čuvanja podataka. Podaci sada preživljavaju ponovno pokretanje servera.
SQL Server i Dapper
Želiš…
Promena
SQL Server umesto SQLite-a
paket Microsoft.EntityFrameworkCore.SqlServer, u Program.cs UseSqlServer(...), adresa npr. Server=(localdb)\\MSSQLLocalDB;Database=Prodavnica;Trusted_Connection=True;TrustServerCertificate=True; zatim nova migracija
SQL upite pisati sam/a
biblioteka Dapper (koristi je prva verzija ove lekcije): brza, ali SQL pišeš ručno – uvek sa parametrima (@id)
Za školske projekte preporučujemo EF Core + SQLite; SQL Server i SQL Server Management Studio koriste se u firmama.
Videi iz prve verzije lekcije (SQL Server i Dapper)
Napomena uz video: snimljen je za prvu verziju lekcija (.NET 5/6, klasa Startup, SQL Server i Dapper). Ideje su iste, ali je kod na ovoj strani pisan za današnji .NET (sve u Program.cs) – kada se razlikuju, važi kod sa strane.
Zadaci za vežbu
Za svaki zadatak postoji primer, uputstvo i rešenje.
ZADATAK 01Težina: teže
Kategorije proizvoda
Dodaj model Kategorija (Id, Naziv) i vezu: svaki proizvod pripada jednoj kategoriji. Napravi migraciju i akciju GET /api/proizvodi/kategorija/2 koja vraća proizvode iz kategorije 2.
Uputstvo
U Proizvod dodaj public int? KategorijaId { get; set; } i public Kategorija? Kategorija { get; set; }; u kontekstu DbSet<Kategorija>. Upitni znak dozvoljava da postojeći proizvodi nemaju kategoriju.
Rešenje
// Models/Kategorija.cs
namespace Prodavnica.Models;
public class Kategorija
{
public int Id { get; set; }
public string Naziv { get; set; } = "";
}
// Models/Proizvod.cs – dodato
public int? KategorijaId { get; set; }
public Kategorija? Kategorija { get; set; }
// Data/ProdavnicaContext.cs – dodato
public DbSet<Kategorija> Kategorije => Set<Kategorija>();
// komandna linija
dotnet ef migrations add Kategorije
dotnet ef database update
// Controllers/ProizvodiController.cs
[HttpGet("kategorija/{kategorijaId:int}")]
public async Task<List<Proizvod>> PoKategoriji(int kategorijaId) =>
await db.Proizvodi.Where(p => p.KategorijaId == kategorijaId).ToListAsync();
Česte greške i saveti
Greška no such table: Proizvodi znači da nije pokrenut dotnet ef database update.
Ne zaboravi SaveChangesAsync() – bez njega izmene ostaju samo u memoriji.
Fajl prodavnica.db ne stavljaj na GitHub (dodaj u .gitignore); baza se pravi iz migracija.
Adresu baze (connection string) sa lozinkom nikad ne upisuj u kod koji je javan.
Proveri znanje
Otvori kviz
Entity Framework Core
1. Šta radi dotnet ef database update?
2. Kako kontroler dobija objekat ProdavnicaContext?
3. Šta se dešava bez poziva SaveChangesAsync()?
KREIRANJE SQL WEB API SERVISA KOJI ČITA PODATKE IZ BAZE
U današnjem digitalnom okruženju, web API servisi postaju ključni za razvoj fleksibilnih i skalabilnih aplikacija. Kroz ovu stranicu, vodićemo vas kroz proces kreiranja SQL Web API servisa koji čita podatke iz baze koristeći ASP.NET Core. Ova aplikacija će vam omogućiti da razumete kako se podaci iz baze pretvaraju u JSON format koji može biti korišćen od strane klijentskih aplikacija. Zašto Koristiti Ove Alate i Pakete?Da bi se izgradila efikasna i funkcionalna web API aplikacija, potrebno je koristiti određene alate i pakete. Svaki od njih ima specifičnu ulogu u procesu razvoja i omogućava vam da:
Efikasno Komunicirate sa Bazom Podataka: Paket Microsoft.Data.SqlClient omogućava uspostavljanje konekcije između vaše aplikacije i SQL Server baze podataka, dok Dapper omogućava brzu i jednostavnu transformaciju rezultata SQL upita u C# objekte.
Ubrzate Rad sa Podacima: Dapper je poznat po svojoj brzini u mapiranju rezultata upita na C# objekte, čime se smanjuje kompleksnost i povećava efikasnost aplikacije u poređenju sa težim ORM rešenjima.
Razvijate i Testirate Aplikaciju: VS Code ili Visual Studio su snažni alati za razvoj i testiranje aplikacija, pružajući vam sve što vam je potrebno za pisanje, debagovanje i upravljanje kodom.
Potrebni Softver i PaketiPre nego što započnete razvoj, uverite se da imate instalirane sledeće alate i pakete:
Preporučena dotnet Verzija: Osigurava da koristite najnovije funkcionalnosti i poboljšanja u .NET okruženju.
Visual Studio Code ili Microsoft Visual Studio: Alati za razvoj koji olakšavaju pisanje i upravljanje kodom. U ovom primeru ćemo koristiti VS Code.
SQL Server: Baza podataka u kojoj će se čuvati vaši podaci. Ovaj vodič koristi SQL Server kao primer.
Microsoft SQL Server Management Studio: Alat za upravljanje i rad sa SQL Server bazama podataka.
Microsoft.Data.SqlClient: Paket za uspostavljanje konekcije sa SQL Server bazom i kreiranje upita.
Dapper: Biblioteka koja omogućava mapiranje podataka iz baze na C# objekte, pružajući efikasnost i brzinu u radu sa podacima.
Pre nego što se pristupi kreiranju web api servisa potrebno je proveriti da li je instalirano sledeće:
Preporučena dotnet verzija.
VS Code ili MS Visual Studio. U ovom primeru je korišćen VS Code
Baza podataka. U ovom primeru je korišćena SQL Server baza
Microsoft SQL Server Management Studio
Da bi mogla da se uspostavi konekcija ka bazi podataka potrebno je instalirati dodatno sledeće pakete:
Microsoft.Data.SQLClient. To je paket koji dopušta da se uspostavi konekcija sa bazom i da se kreiraju upiti
Dapper. Ovaj paket dopušta da se podaci uvezu iz baze i pretvore u odgovarajuče C# objekte
Slika 1: ASP.NET core web API server - poziv klijenta
Pored web aplikacije koji kreiramo potrebno da imamo jednu bazu podataka, na primjer sql server bazu podataka u kojoj se nalaze neki podaci, npr. tabela za proizvode. Cilj web API aplikacije je da odgovori na zahtev klijenta za određenim proizvodom. Kada se uputi GET zahtev, za određenim proizvodom na primer sa id = 15:
https://localhost:5001/products/15
aplikacija će pokušati da iz baze izvuče odgovarajući proizvod i vrati nazad aplikaciji( slika 2). Pomoću dodatnog paketa "Dapper", koji smo instalirali sa aplikacijom , odgovarajući red tabele će se pretvoriti u odgovarajući C# objekat koji ima istu strukturu kao tabela u bazi. Primer klase Product možete videti na slici 3. Dalje, web api konvertuje podatke u JSON objekat a zatim se objekat vraća pregledaču(vidi sliku 4 ).
Slika 2: ASP.NET core web API server - GET zahtev za proizvodom iz baze
Aplikacija treba da ima model klasu čija polja odgovaraju poljima koja se nalaze u bazi podataka da bi taj zapis mogao da se pretvori u c# objekat da bi aplikacija mogla da kreiraobjekat koji će da se poveže sa bazom podataka u kodu mora da se napravi klijent za bazu, a zato je potreban dodatni paket "Microsoft.Data.SqlClient".
Video 1: Jednostavan web API server koji čita podatke iz baze - 1. deo
Video 2: Jednostavan web API server koji čita podatke iz baze - 2. deo
Detaljnije objašnjenje arhitekture Web API-ja:
Kontroleri: U Web API arhitekturi, kontroleri su odgovorni za upravljanje HTTP zahtevima i vraćanje odgovora. Svaki kontroler definiše skup akcija koje odgovaraju na specifične rute (URL-ove).
Modeli: Modeli predstavljaju strukturu podataka i definišu objekte koji se koriste za razmenu informacija između različitih slojeva (npr. iz baze podataka).
Servisni sloj: Ovaj sloj sadrži poslovnu logiku aplikacije, kao i interakciju sa bazom podataka. Kontroleri se pozivaju na servisni sloj da bi izvršili određene operacije nad podacima.
Ova arhitektura olakšava održavanje, testiranje i skaliranje aplikacije.Sigurnosne preporuke:
Autentifikacija: Implementiraj sigurne metode autentifikacije poput JWT (JSON Web Token) ili OAuth2 za verifikaciju korisnika.
Autorizacija: Kontroliši pristup resursima koristeći Role-based ili Policy-based autorizaciju kako bi osigurao da samo ovlašćeni korisnici mogu pristupiti osetljivim podacima.
Zaštita podataka: Koristi SSL/TLS enkripciju za siguran prenos podataka i zaštitu od napada poput SQL injekcija ili Cross-Site Scripting (XSS).
Optimizacija performansi:
Keširanje: Implementiraj keširanje odgovora na nivou servera ili klijenta kako bi smanjio učestalost zahteva prema bazi.
Optimizacija upita: Koristi indekse i optimizovane SQL upite kako bi smanjio vreme obrade i poboljšao performanse aplikacije pri radu sa velikim količinama podataka.
Slika 3: ASP.NET core web API server - model klasa Product
Slika 4: ASP.NET core web API server - vraćanje JSON objekta klijentu(web pregledaču)
Kreiranje restful web api servera
Da bi se kreirala nova web api aplikacija u Command Prompt-u u okviru prethodno kreiranog root foldera treba otkucati
dotnet new api
kao što se vidi i na slici 5.
Slika 5: dotnet WEB API- Kreiranje nove aplikacije u CommandPrompt-u
Ako u command prompt-u otkucamo
code .
Pokrenuće se VS Code i otvoriti u njemu upravo kreirani projekat.
Slika 6: SimpleWebApiWidthDatabase aplikacija - klasa Program.cs
Sada se sa leve strane u exploreru mogu videti kreirani početni fajlovi upravo kreirane aplikacije. U desnom delu se vidi sadržaj početnog fajla Program.cs u kome se konfiguriše host objekat aplikacije. S obzirom da je potrebna baza za proizvode treba kreirati bazu, u ovom slučaju SQL Server bazu, koja će se zvati u ovom primeru "database_product". Baza i u njoj tabela "Products" je kreirana pomoću alata Microsoft SQL Server Management Studio. Dizajn kreirane tabele može se videti na slici ispod:
Slika 7: Sql Server Database: Baza "database_products", za proizvode
Da bi aplikacija konektovala na bazu potrebno je da budu instalirani gore pomenuti paketi:
Microsoft.Data.SQLClient
Dapper
Konekcija se uspostavlja kreiranjem objekta koji će predstavljati klijent za bazu i da bi se on kreirao potrebne su informacije date ConnectionString-om. Kreiraćemo ConnectionString unutar appsetings.json fajlaPogledajte u sledećem videu kako se koristi Dapper biblioteka za čitanje podataka iz baze i njihovo konverovanje u C# objekte. U videu je pokazana upotreba odgovarajućih querry-ja za tu namenu. Koristan tutorijal o upotrebi Dapper-a: dapper-tutorial.net/
Dapper je lagana biblioteka za pristup podacima u .NET aplikacijama koja omogućava efikasno i jednostavno mapiranje podataka iz baze podataka na C# objekte. Razvijena je da pruži brzinu i jednostavnost u odnosu na druge ORM (Object-Relational Mapping) biblioteke poput Entity Framework-a, dok zadržava fleksibilnost i kontrolu. Evo nekoliko ključnih tačaka o Dapper biblioteci:
Jednostavnost i Brzina: Dapper je poznat po svojoj brzini, jer je dizajniran da bude minimalan i da izbegne složene procese koje neki ORM-ovi koriste. Ova brzina dolazi iz njegove sposobnosti da direktno mapira rezultate upita na objekte bez puno dodatnog overhead-a.
Mapiranje Rezultata: Dapper omogućava mapiranje rezultata SQL upita na C# objekte koristeći jednostavne metode kao što su Query<T> i QuerySingle<T>. Ovo pojednostavljuje rad sa podacima i smanjuje potrebu za pisanjem puno koda za transformaciju podataka.
Kompatibilnost sa SQL Serverom i Drugi DBMS: Iako je najčešće korišćen sa SQL Server-om, Dapper je kompatibilan sa različitim bazama podataka, kao što su MySQL, PostgreSQL, SQLite i drugi, koristeći odgovarajuće ADO.NET provajdere.
Nepristrasnost: Dapper ne pruža funkcionalnosti kao što su automatsko kreiranje migracija ili složeni upiti. Umesto toga, pruža alat za direktno pisanje SQL upita i komandama, što omogućava potpunu kontrolu nad SQL-om koji se izvršava.
Ekstenzija za Postojeće ADO.NET: Dapper se koristi kao ekstenzija za postojeće ADO.NET objekte, kao što su IDbConnection. Ovo omogućava korišćenje Dapper-a u već postojećim projektima bez potrebe za značajnim prepravkama.
Dapper je odličan izbor kada vam je potrebna brzina i jednostavnost, ali želite da imate potpunu kontrolu nad SQL upitima koje koristite.
Slika 8: SimpleWebApiWidthDatabase aplikacija - ConnectionString definisan u appsetings.json fajlu
U okviru startup fajla unutar metode configuration kreiraćemo objekat pomoću koga se uspostavlja veza sa bazom podataka. Za kreiranje tog objekta klase SqlConnection koristimo informacije zapisane u konekcionom stringu koji je definisan u appsettings.json fajlu, kao što se može videti na sledećoj slici:
Slika 9: Web API server: Kontroler klasa "ProductController"
. Unutar ove metode vrši ubacivanje zavisnosti (DependencyInjection) između klasa u aplikaciji i njima potrebnih servisa i objeka. Unutar ove metode se kreiraju servisi koji se dodaju u kolekciju servisa(IServiceCollection), koji će biti dostupni u klasama unutar aplikacije preko parametara u konstruktoru. Ovaj koncept se zove IoC Inverzija kontrole i više o tome pogledajte u videu: IoC Inverzija kontrole u .Net aplikacijama. Takođe, treba dodati kontrolere u ovu kolekciju.
Uputstva za Konfiguraciju
Kada radimo sa statičkim stranicama u ASP.NET Core aplikaciji, važno je pravilno konfigurirati server da bi mogao da ih servira. Ovo se postiže dodavanjem specifičnih linija koda u Startup.cs datoteku, koja je ključna za konfiguraciju i inicijalizaciju aplikacije.public class Startup { public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // Koristi zadate fajlove kao što su index.html ako nije specificiran drugi fajl app.UseDefaultFiles();
// Omogućava serviranje statičkih fajlova iz wwwroot direktorijuma app.UseStaticFiles();
// Ostali middleware i konfiguracije } }Šta ove linije koda rade:
app.UseDefaultFiles();
Šta radi: Ova linija omogućava serveru da automatski koristi zadate fajlove kada korisnik ne specificira određeni fajl u URL-u. Na primer, ako korisnik poseti http://localhost:5000/, server će automatski vratiti index.html iz wwwroot foldera ako postoji.
Zašto je važna: Ovo je korisno za pružanje osnovne stranice kao što je index.html kada korisnik poseti koreni URL vaše aplikacije, bez potrebe da eksplicitno navede ime fajla.
app.UseStaticFiles();
Šta radi: Ova linija omogućava serveru da servira statičke fajlove kao što su HTML, CSS, JavaScript, slike itd., iz wwwroot foldera. Kada korisnik zatraži URL koji odgovara nekom fajlu u wwwroot (kao što je http://localhost:5000/Students.html), server će pronaći taj fajl i poslati ga klijentu.
Zašto je važna: Ova komanda omogućava vašoj aplikaciji da efikasno posluži statičke resurse koje su potrebne za prikazivanje web stranica, čime se omogućava korisnicima da vide sadržaj vaše web stranice.
Konfiguracija wwwroot direktorijuma:
wwwroot je podrazumevani direktorijum za statičke fajlove u ASP.NET Core aplikaciji. Kada dodate ovu konfiguraciju, ASP.NET Core automatski traži statičke fajlove u ovom direktorijumu.
Kako dodati fajlove: Da biste dodali statičke stranice kao što su Contact.html ili Index.html, jednostavno ih stavite u wwwroot direktorijum. URL-ovi kao što su http://localhost:5000/Contact.html će sada vraćati odgovarajući sadržaj iz tog fajla.
Ove konfiguracione linije omogućavaju efikasno serviranje statičkog sadržaja i omogućavaju vam da jednostavno proširite vašu aplikaciju sa statičkim stranicama prema potrebi.Unutar metode Configure treba definisati potrebne "Middleware" i njihov redosled kojim treba da se izvrše. Više o tome pročitajte u članku: Middleware
Slika 10: Web API server: Startup klasa, metoda "Configure"
Ova aplikacija će imati klase koje pripadaju modelu, kao i jednu kontroler klasu. Kao model kreiraćemo klasu Product koja će biti model klasa za objekte koji predstavljaju podatke o određenom proizvodu i imaće istu strukturu kao jedan zapis u bazi podataka, dakle imaće ista polja. Na slici 12 je prikazana klasa Product
Slika 11: Web API server: "Product" klasa
Inverzija kontrole(IoC) u .net aplikacijama
Inverzija kontrole (IoC) je princip dizajna u softverskom razvoju koji omogućava veću fleksibilnost i testabilnost aplikacija smanjenjem zavisnosti između komponenti. U kontekstu .NET aplikacija, IoC se obično koristi uz DI (Dependency Injection), što je jedan od najpopularnijih načina za implementaciju IoC principa. Ključni Koncepti IoC
Inverzija Kontrole (IoC): Ovaj princip se odnosi na prebacivanje kontrole nad kreiranjem objekata i upravljanjem njihovim životnim ciklusom sa aplikacijskog koda na neki spoljašnji sistem, najčešće IoC kontejner. Umesto da komponenta direktno kreira i upravlja zavisnostima, IoC kontejner to radi.
Dependency Injection (DI): Ovo je tehnika za implementaciju IoC-a gde zavisnosti (npr. servisi ili objekti koje klasa koristi) se "ubacuju" u klasu sa spoljašnjeg izvora, umesto da ih klasa kreira sama. Ovo može da se uradi na nekoliko načina:
Konstruktor DI: Zavisnosti se prenose kroz konstruktor klase.
Proprijet DI: Zavisnosti se postavljaju preko javnih svojstava (proprijeta).
Metoda DI: Zavisnosti se prosleđuju kroz metodu.
Prednosti IoC i DI
Smanjena Zavistanost: Komponente su manje zavisne jedna od druge, što čini kod fleksibilnijim i lakšim za promene.
Povećana Testabilnost: Sa zavisnostima ubačenim iz spolja, lako je koristiti mock objekte ili stubove u testiranju.
Bolja Organizacija Koda: Korišćenje IoC kontejnera pomaže u organizaciji i upravljanju zavisnostima, čime se smanjuje složenost kod baze.
Promena Implementacija: Mogućnost lako menjanja implementacija zavisnosti bez promene koda koji ih koristi.
IoC Konteneri u .NET-uU .NET ekosistemu, postoje različiti IoC kontejneri koje možete koristiti:
Microsoft.Extensions.DependencyInjection: Ovo je osnovni IoC kontejner koji dolazi sa .NET Core i .NET 5/6+. Pruža osnovne funkcionalnosti DI i lako se integriše u .NET aplikacije.
Autofac: Napredniji IoC kontejner sa dodatnim mogućnostima i konfiguracijom.
Ninject: Još jedan popularan IoC kontejner poznat po svojoj fleksibilnosti i jednostavnosti korišćenja.
Unity: Microsoft-ov IoC kontejner koji je deo Enterprise Library.
Kako se koristi u .NET aplikacijamaKada koristite IoC u .NET aplikacijama, obično ćete registrovati svoje servise u IoC kontejneru tokom inicijalizacije aplikacije, a zatim će IoC kontejner automatski obezbediti potrebne zavisnosti za vaše klase. Na primer, u ASP.NET Core aplikacijama, registracija servisa se obavlja u Startup.cs datoteci:public void ConfigureServices(IServiceCollection services) { services.AddTransient<IMyService, MyService>(); // Dodajte druge servise }A zatim, kada koristite IMyService u vašim kontrolerima ili drugim klasama, .NET će automatski obezbediti instancu MyService:public class MyController : Controller { private readonly IMyService _myService;
public MyController(IMyService myService) { _myService = myService; } }Ukratko, IoC i DI su ključni za moderne .NET aplikacije jer pomažu u održavanju čistog, fleksibilnog i testabilnog koda.
Optimizacija performansi:
Optimizacija upita: Potrebno je koristiti indekse za ubrzanje pristupa podacima i smanjenje vremena obrade složenih SQL upita. Takođe je potrebno analizirati upite koristeći SQL Server alatke poput Query Execution Plan kako bi se identifikovali i poboljšali sporiji upiti.
Keširanje: Potrebno je implementirati keširanje podataka na nivou aplikacije ili baze. Koristite Redis ili Memcached za skladištenje često korišćenih podataka, čime će se smanjiti učestalost pristupa bazi i ubrzati aplikacija.
Ove tehnike značajno povećavaju efikasnost Web API servisa.
Sigurnosne preporuke
Sigurnost je ključna za svakog web API servisa kako bi se zaštitili podaci i sprečili neautorizovani pristupi. Evo nekoliko ključnih sigurnosnih preporuka i kako ih implementirati u ASP.NET Core aplikaciji: 1. AutentifikacijaAutentifikacija je proces identifikacije korisnika koji pristupa vašem API-ju. Preporučuje se korišćenje JSON Web Tokens (JWT) za sigurnu autentifikaciju. Kako Implementirati JWT:
Dodavanje NuGet Paketa: Dodajte Microsoft.AspNetCore.Authentication.JwtBearer paket u vaš projekat:
2. Konfigurišite JWT u Startup.cs: U ConfigureServices metodi dodajte konfiguraciju za JWT:public voidConfigureServices(IServiceCollection services) { services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "yourissuer", ValidAudience = "youraudience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")) }; }); services.AddControllers(); }3. Dodajte Autentifikaciju u Configure Metodu:public voidConfigure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }Autorizacija kontroliše pristup resursima baziran na korisničkim ulogama ili politikama. Kako Implementirati Autorizaciju:
Definišite Politike: U Startup.cs, u ConfigureServices metodi, dodajte:
services.AddAuthorization(options => { options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin")); });Koristite Politike u Kontrolerima:[Authorize(Policy = "AdminOnly")] [ApiController] [Route("[controller]")] public classAdminController : ControllerBase { // Actions }3. Zaštita PodatakaZa zaštitu podataka, koristite SSL/TLS enkripciju za siguran prenos podataka i zaštitu od napada kao što su SQL injekcije ili Cross-Site Scripting (XSS). Kako Konfigurišete SSL/TLS:
Koristimo kolačiće da bismo vam pružili najbolje moguće iskustvo. Takođe nam omogućavaju da analiziramo ponašanje korisnika kako bismo stalno poboljšavali veb lokaciju za vas.