Sobes.tech
Middle

ASP.NET Core'da bog'lanishni injektsiya qilish (DI) nima?

sobes.tech AI

AIdan javob

Bağımlılıqlarni injektsiya qilish (DI) - bu nazoratni teskari qilish (IoC) uchun dizayn shabloni bo'lib, u zaif bog'langan kod yaratishga imkon beradi. ASP.NET Core'da DI o'z ichiga olgan funksiyadir, u sinflar o'rtasidagi bog'liqliklarni boshqarishni osonlashtiradi.

ASP.NET Core'da DI ning asosiy komponentlari:

  1. Xizmatlar: Funktsiyalarni ta'minlaydigan obyektlar (masalan, depo sinflari, loglash xizmatlari).
  2. DI konteyneri: Bog'liqliklarni hal qilish va xizmat nusxalarini yaratish uchun javobgar obyekt.
  3. Xizmatlarning hayot aylanishi: Qachon va qanday qilib xizmat nusxalari yaratilishini belgilaydi:
    • Transient: Har bir xizmat so'rovi uchun yangi nusxa yaratiladi.
    • Scoped: Har bir so'rov uchun (veb ilovalar uchun - har bir HTTP so'rovi uchun) bir nusxa.
    • Singleton: Birinchi so'rovda yaratiladi va ilova davomida ishlatiladi.

DI dan foydalanishning afzalliklari:

  • Zaif bog'lanish: Sinflar aniq (interfeyslar) ga bog'liq bo'lib, aniq amalga oshirishlarga emas.
  • Test qilish imkoniyati: Haqiqiy bog'liqliklarni "mocks" yoki "stubs" bilan oson almashtirish mumkin.
  • Kengaytirilishi: Xizmatlarning amalga oshirishlarini ularni o'zgartirmasdan o'zgartirish oson.
  • Bog'liqliklarni boshqarish: DI konteyneri hayot aylanishini va nusxalarni yaratishni boshqaradi.

Startup.cs (yoki .NET 6+ uchun Program.cs) da xizmatlarni ro'yxatdan o'tkazish misoli:

// ConfigureServices metodida
public void ConfigureServices(IServiceCollection services)
{
    // Singleton hayot aylanishi bilan xizmatni ro'yxatdan o'tkazish
    services.AddSingleton<ILogger, EmailLogger>();

    // Scoped hayot aylanishi bilan xizmatni ro'yxatdan o'tkazish
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Transient hayot aylanishi bilan xizmatni ro'yxatdan o'tkazish
    services.AddTransient<ITransientService, TransientService>();

    // Kontrollerlarni bog'liqliklarni in'ektsiya qilish uchun ro'yxatdan o'tkazish
    services.AddControllersWithViews();
}
Kontroller konstruktorida bog'liqliklarni in'ektsiya qilish:

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

    // ASP.NET Core DI bu bog'liqliklarni avtomatik hal qiladi va in'ektsiya qiladi
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... kontroller harakatlari
}