Sobes.tech
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:

  1. Pakalpojumi: Objekti, kas nodrošina funkcionalitāti (piemēram, repozitāriju klases, žurnāla pakalpojumi).
  2. DI konteineris: Objekts, kas atbild par atkarību risināšanu un pakalpojumu instanču izveidi.
  3. 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
}