C# - Problemi i rješenja izdvojena tema

poruka: 2.138
|
čitano: 862.001
|
moderatori: XXX-Man
+/- sve poruke
ravni prikaz
starije poruke gore
7 godina
offline
C# - Problemi i rješenja

Pozdrav!

 

Pokušavam shvatiti način na koji funkcionira Dependency Injection u .NET Core.

Dakle, imam jedan ASP.NET Core WebAPI projekt i imam Class Library projekt. CL projekt mi predstavlja DataAccess Layer gdje mi se nalazi EntityFrameworkCore veza s postojećom bazom podataka.

Također imam sučelje i klasu koja implementira to sučelje (IUserRepository, UserRepository).

 

Kod u Program.cs datoteci mi izgleda ovako:

builder.Services.AddDbContext<SocialNetworkContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Database")));
builder.Services.AddScoped<IUserRepository, UserRepository>();

 

I sad, ja koristim taj context u UserRepository klasi:

private readonly SocialNetworkContext _socialNetworkContext;

public UserRepository(SocialNetworkContext context)
{
   _socialNetworkContext = context;
}

 

Nakon toga UserRepository klasu koristim u pripadajućem kontroleru:

private IUserRepository _userRepository;
public UsersController(IUserRepository userRepository)
{
  this._userRepository = userRepository;
}

 

I API funkcionira. Kako je to moguće?

Nisam nigdje instancirao ni DbContext klasu, niti UserRepository klasu. Nemam nigdje definiranu vezu između DbContext i UserRepository klasa, nisam nigdje injectao DbContext objekt u UserRepository klasu, no program i dalje funkcionira kao da objekt postoji.

Ne shvaćam baš ovaj koncept, proguglao sam već par objašnjenja za Dependency Injection no dosta mi je šturo objašnjeno.

 
0 0 hvala 0
17 godina
offline
C# - Problemi i rješenja

Pa definirao si u Program.cs da se injecta taj tvoj repository u svaki kontroler koji u konstruktoru ima taj tip klase kao parametar.

 

.net core ti sam instancira kontroler sa repozitorijem (ili logerom, business logic layer handlerom ili nečim šestim, ovisno što ti treba u tom kontroleru). Tako funkcionira DI u .net coreu.

 

Sad opet ovisi koji tip DI koristiš hoće li se tvoj repozitorij kreirati pri svakom requestu, pri svakoj konekciji ili samo prvi put kad je napravljen request: Tranzitni, Scoped ili Singleton

Rvat katolik!
 
1 0 hvala 1
7 godina
offline
Re: C# - Problemi i rješenja
tnakir kaže...

Pa definirao si u Program.cs da se injecta taj tvoj repository u svaki kontroler koji u konstruktoru ima taj tip klase kao parametar.

 

.net core ti sam instancira kontroler sa repozitorijem (ili logerom, business logic layer handlerom ili nečim šestim, ovisno što ti treba u tom kontroleru). Tako funkcionira DI u .net coreu.

 

Sad opet ovisi koji tip DI koristiš hoće li se tvoj repozitorij kreirati pri svakom requestu, pri svakoj konekciji ili samo prvi put kad je napravljen request: Tranzitni, Scoped ili Singleton

 Znači isto tako je ova linija koda zaslužna da se DbContext injecta u svaku klasu koja ga koristi?

builder.Services.AddDbContext<SocialNetworkContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Database")));

 

Hvala na objašnjenju!

10 godina
offline
Re: C# - Problemi i rješenja

Ta je linija zadužena da se DI sustavu unutar .Neta "dojavi" da kod svakog instanciranja klase (repository) instancira DbContext. Samo instanciranje vrši DI sistem.

17 godina
offline
Re: C# - Problemi i rješenja
arnep kaže...
tnakir kaže...

Pa definirao si u Program.cs da se injecta taj tvoj repository u svaki kontroler koji u konstruktoru ima taj tip klase kao parametar.

 

.net core ti sam instancira kontroler sa repozitorijem (ili logerom, business logic layer handlerom ili nečim šestim, ovisno što ti treba u tom kontroleru). Tako funkcionira DI u .net coreu.

 

Sad opet ovisi koji tip DI koristiš hoće li se tvoj repozitorij kreirati pri svakom requestu, pri svakoj konekciji ili samo prvi put kad je napravljen request: Tranzitni, Scoped ili Singleton

 Znači isto tako je ova linija koda zaslužna da se DbContext injecta u svaku klasu koja ga koristi?

builder.Services.AddDbContext<SocialNetworkContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Database")));

 

Hvala na objašnjenju!

Zapravo ti ta linija instancira sam DbContext i definira na koji će se DBMS spajati (SQL, mySQL, SQLite etc...) i kroz koji connString će se spajati na bazu (npr ovde možeš definirati da ti se u dev environmentu spaja na testnu bazu, a u produkcijskom na produkcijsku bazu).

 

DbContextu bi trebao pristupati isključivo kroz Repository. DI bi ti trebao instancirati repozitorij u svakom kontroleru koji ga ima u konstruktoru. 

Rvat katolik!
7 godina
offline
Re: C# - Problemi i rješenja
tnakir kaže...

Zapravo ti ta linija instancira sam DbContext i definira na koji će se DBMS spajati (SQL, mySQL, SQLite etc...) i kroz koji connString će se spajati na bazu (npr ovde možeš definirati da ti se u dev environmentu spaja na testnu bazu, a u produkcijskom na produkcijsku bazu).

 

DbContextu bi trebao pristupati isključivo kroz Repository. DI bi ti trebao instancirati repozitorij u svakom kontroleru koji ga ima u konstruktoru. 

 

Ne znači li to veliki udarac na performanse aplikacije?

Nas su na faksu učili da DbContext objekti uzimaju puno memorije pa je bolja opcija korisitit ih uz using blokove čime context objekt postoji samo unutar tog bloka koda. Sad vidim da se u praksi koriste uz DI pa mi je malo čudno.

10 godina
offline
Re: C# - Problemi i rješenja

DbContext je optimiziran da se brzo instancira, odradi što je potrebno (jedan unit of work, dakle jedan query ili jedan blok transakcija) i bude disposed. Ima neki sitni overhead kod instanciranja ali te profesore nitko nije obavijestio da je 1998. godina bila prije 25 godina i da server ima malo više od 128MB RAM.

7 godina
offline
Re: C# - Problemi i rješenja
Nuclear_Phoenix kaže...

DbContext je optimiziran da se brzo instancira, odradi što je potrebno (jedan unit of work, dakle jedan query ili jedan blok transakcija) i bude disposed. Ima neki sitni overhead kod instanciranja ali te profesore nitko nije obavijestio da je 1998. godina bila prije 25 godina i da server ima malo više od 128MB RAM.

 Jasno. Hvala na objašnjenju!

Nova poruka
E-mail:
Lozinka:
 
vrh stranice