Sobes.tech
Middle

Ի՞նչ է կախվածությունների ներդրումը (DI) ASP.NET Core-ում։

sobes.tech AI

Պատասխան AI-ից

Անհրաժեշտությունների ներդնումը (DI)՝ դա նախագծման ձևանմուշ է կառավարման հակառակը (IoC), որը թույլ է տալիս ստեղծել թույլ կապ ունեցող կոդ: ASP.NET Core-ում DI-ն ներքին գործառույթ է, որը հեշտացնում է դասերի միջև կախվածությունների կառավարումը:

DI-ի հիմնական բաղադրիչները ASP.NET Core-ում՝

  1. Ծառայություններ: Օբյեկտներ, որոնք տրամադրում են գործառույթներ (օրինակ՝ պահոցների դասեր, լոգավորման ծառայություններ):
  2. DI կոնտեյներ: Օբյեկտ, որը պատասխանատու է կախվածությունների լուծման և ծառայությունների օրինակների ստեղծման համար:
  3. Ծառայությունների կյանքի տևողությունը: Կարգավորում է, երբ և ինչպես են ստեղծվում ծառայությունների օրինակները՝
    • Transient: Նոր օրինակ ստեղծվում է յուրաքանչյուր ծառայության խնդրանքով:
    • Scoped: Մի օրինակ ստեղծվում է յուրաքանչյուր խնդրանքի համար (վեբ հավելվածների համար՝ յուրաքանչյուր HTTP խնդրանքի համար):
    • Singleton: Մի օրինակ ստեղծվում է առաջին խնդրանքի ժամանակ և օգտագործվում ամբողջ ծրագրի ընթացքում:

Անհրաժեշտությունների օգտագործման առավելությունները՝

  • Թույլ կապ: Կլասները կախված են աբստրակցիաներից (ինտերֆեյսներից), ոչ թե կոնկրետ իրագործումներից:
  • Թեստավորման հեշտություն: Լավ է փոխարինել իրական կախվածությունները "մոկեր" կամ "ստաբ"-ներով՝ միավորային թեստավորման ժամանակ:
  • Արժեքների ընդլայնելիություն: Լավ է փոխարինել ծառայությունների իրագործումները՝ առանց կոդի փոփոխության, որը կախված է դրանցից:
  • Կառավարում կախվածությունների: 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;
    }

    // ... գործողություններ
}