Middle
Kas ir atkarību injekcija (DI) ASP.NET Core?
sobes.tech AI
Atbilde no AI
Atkarību ieviešana (DI) ir dizaina paraugs, kas paredz pārvaldīt kontroli (IoC), ļaujot izveidot vājināti saistītu kodu. ASP.NET Core DI ir iebūvēta funkcija, kas ļauj viegli pārvaldīt klases atkarības.
Galvenās DI sastāvdaļas ASP.NET Core:
- Pakalpojumi: Objekti, kas nodrošina funkcionalitāti (piemēram, repozitāriju klases, žurnāla pakalpojumi).
- DI konteineris: Objekts, kas atbild par atkarību risināšanu un pakalpojumu instanču izveidi.
- Pakalpojumu dzīves cikls: Nosaka, kad un kā tiek izveidoti pakalpojumu eksemplāri:
- Transient: Jauns eksemplārs tiek izveidots katram pieprasījumam.
- Scoped: Viens eksemplārs tiek izveidots katram pieprasījumam (tīmekļa lietojumprogrammām — katram HTTP pieprasījumam).
- Singleton: Viens eksemplārs tiek izveidots pirmajā pieprasījumā un tiek izmantots visa lietojumprogrammas darbības laikā.
DI priekšrocības:
- Vāja saistība: Klases ir atkarīgas no abstrakcijām (interfeisiem), nevis no konkrētām realizācijām.
- Testējamība: Ir viegli aizstāt reālas atkarības ar "mokiņiem" (mocks) vai "stubiem" (stubs) vienību testēšanā.
- Paplašināmība: Ir viegli aizstāt pakalpojumu realizācijas bez koda izmaiņām, kas no tiem ir atkarīgas.
- Atkarību pārvaldība: DI konteineris pārvalda dzīves ciklu un eksemplāru izveidi.
Piemērs pakalpojumu reģistrēšanai Startup.cs (vai Program.cs .NET 6+):
// ConfigureServices metodē
public void ConfigureServices(IServiceCollection services)
{
// Reģistrēt pakalpojumu ar singleton dzīves ciklu
services.AddSingleton<ILogger, EmailLogger>();
// Reģistrēt pakalpojumu ar scoped dzīves ciklu
services.AddScoped<IDataRepository, SqlDataRepository>();
// Reģistrēt pakalpojumu ar transient dzīves ciklu
services.AddTransient<ITransientService, TransientService>();
// Reģistrēt kontrolierus atkarību ieviešanai
services.AddControllersWithViews();
}
Atkarību ieviešana kontroliera konstruktorā:
```csharp
public class HomeController : Controller
{
private readonly ILogger _logger;
private readonly IDataRepository _repository;
// ASP.NET Core DI automātiski risina un ievieš šīs atkarības
public HomeController(ILogger logger, IDataRepository repository)
{
_logger = logger;
_repository = repository;
}
// ... kontroliera darbības
}