Sobes.tech
Middle

რა არის დამოკიდებულებების ინექცია (DI) ASP.NET Core-ში?

sobes.tech AI

პასუხი AI-სგან

დამოკიდებულებების ინტეგრაცია (DI) — ეს დიზაინის ნიმუშია მართვის უკუაღრევა (IoC) — ის, რომელიც საშუალებას აძლევს შექმნათ სუსტი კავშირის კოდი. ASP.NET Core-ში DI არის ინტეგრირებული ფუნქცია, რომელიც ადვილად მართავს კლასებს შორის დამოკიდებულებებს.

ASP.NET Core-ის ძირითადი კომპონენტები DI-ში:

  1. სერვისები: ობიექტები, რომლებიც უზრუნველყოფენ ფუნქციონალობას (მაგალითად, რეპოზიტორიის კლასები, ლოგირების სერვისები).
  2. DI კონტეინერი: ობიექტი, რომელიც პასუხისმგებელია დამოკიდებულებების გადაჭრაზე და სერვისების ინსტანციების შექმნაზე.
  3. სერვისების სიცოცხლის ციკლი: განსაზღვრავს, როდის და როგორ იქმნება სერვისების ინსტანციები:
    • Transient: ახალი ინსტანცია იქმნება ყოველ მოთხოვნაზე.
    • Scoped: ერთი ინსტანცია იქმნება თითო მოთხოვნისთვის (ვებ-აპლიკაციებისთვის — თითო HTTP მოთხოვნისთვის).
    • Singleton: ერთი ინსტანცია იქმნება პირველ მოთხოვნაზე და გამოიყენება მთელი პროგრამის განმავლობაში.

DI-ის გამოყენების უპირატესობები:

  • სუსტი კავშირი: კლასები დამოკიდებულია აბსტრაქციებზე (ინტერფეისებზე), არა კონკრეტულ რეალიზაციებზე.
  • ტესტირებადობა: მარტივია რეალური დამოკიდებულებების შეცვლა "მოკებით" ან "სტუბებით" ერთეულ ტესტირებაში.
  • გაფართოებადობა: მარტივია სერვისების რეალიზაციების შეცვლა, კოდის შეცვლის გარეშე, რომელიც მათზეა დამოკიდებული.
  • დამოკიდებულებების მართვა: DI კონტეინერი მართავს სიცოცხლის ციკლს და ინსტანციების შექმნას.

მაგალითი სერვისების რეგისტრაციის Startup.cs (ან Program.cs .NET 6+-ში):

// ConfigureServices მეთოდში
public void ConfigureServices(IServiceCollection services)
{
    // სერვისის რეგისტრაცია singleton სიცოცხლის ციკლთან
    services.AddSingleton<ILogger, EmailLogger>();

    // სერვისის რეგისტრაცია scoped სიცოცხლის ციკლთან
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // სერვისის რეგისტრაცია transient სიცოცხლის ციკლთან
    services.AddTransient<ITransientService, TransientService>();

    // კონტროლერების რეგისტრაცია დამოკიდებულებების დასამატებლად
    services.AddControllersWithViews();
}

დამოკიდებულებების ინტეგრაცია კონტროლერის კონსტრუქტორში:

```csharp
public class HomeController : Controller
{
    private readonly ILogger _logger;
    private readonly IDataRepository _repository;

    // ASP.NET Core DI ავტომატურად გადაწყვეტს და დააინსტალირებს ამ დამოკიდებულებებს
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... კონტროლერის მოქმედებები
}