Middle
Ի՞նչ է կախվածությունների ներդրումը (DI) ASP.NET Core-ում։
sobes.tech AI
Պատասխան AI-ից
Անհրաժեշտությունների ներդնումը (DI)՝ դա նախագծման ձևանմուշ է կառավարման հակառակը (IoC), որը թույլ է տալիս ստեղծել թույլ կապ ունեցող կոդ: ASP.NET Core-ում DI-ն ներքին գործառույթ է, որը հեշտացնում է դասերի միջև կախվածությունների կառավարումը:
DI-ի հիմնական բաղադրիչները ASP.NET Core-ում՝
- Ծառայություններ: Օբյեկտներ, որոնք տրամադրում են գործառույթներ (օրինակ՝ պահոցների դասեր, լոգավորման ծառայություններ):
- DI կոնտեյներ: Օբյեկտ, որը պատասխանատու է կախվածությունների լուծման և ծառայությունների օրինակների ստեղծման համար:
- Ծառայությունների կյանքի տևողությունը: Կարգավորում է, երբ և ինչպես են ստեղծվում ծառայությունների օրինակները՝
- 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;
}
// ... գործողություններ
}