DEV Community

Elshod Ibodullayev
Elshod Ibodullayev

Posted on

Dependency Injection (DI) and Middleware

Dependency Injection (DI) — bu loyihadagi sinflar o‘rtasida qattiq bog‘lanishni kamaytiradigan dizayn pattern.

Oddiy qilib aytsak:

Bir sinf (masalan, Controller) boshqa sinfni o‘zi yaratib olmaydi, balki tashqaridan (ASP.NET Core container) oladi.

Bu sinflarni testlash, almashtirish va sozlashni osonlashtiradi.

Oddiy misol:
Servis interfeysi
public interface IDatabaseService
{
string GetData();
}

Servis implementatsiyasi
public class SqlDatabaseService : IDatabaseService
{
public string GetData() => "SQL Database dan ma'lumot olindi";
}

Servisni ro‘yxatdan o‘tkazish (Program.cs / Startup.cs)
builder.Services.AddTransient();

Controllerda foydalanish

public class HomeController : Controller
{
    private readonly IDatabaseService _databaseService;

    // DI orqali konstruktor orqali keladi
    public HomeController(IDatabaseService databaseService)
    {
        _databaseService = databaseService;
    }

    public IActionResult Index()
    {
        var data = _databaseService.GetData();
        return Content(data);
    }
}
Enter fullscreen mode Exit fullscreen mode

➡️ Bunda HomeController qaysi servis ishlatilishini bilmaydi – DI container unga to‘g‘risini beradi.
Agar keyinroq PostgreSqlDatabaseService yozilsa, faqatgina DI ro‘yxatida almashtirish kifoya. Controller kodi o‘zgarmaydi.

Middleware

ASP.NET Core’da har bir so‘rov va javob pipeline orqali o‘tadi.
Pipeline — bu Middleware’lar zanjiri. Har bir middleware:

So‘rovni qabul qiladi.

O‘z vazifasini bajaradi (masalan, loglash, autentifikatsiya, exception handling).

Keyingi middleware’ga uzatadi (await _next(context) orqali).

Oddiy Middleware

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;

    public LoggingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        Console.WriteLine($"So'rov keldi: {context.Request.Path} | {DateTime.Now}");

        await _next(context); // Keyingi middlewarega o'tadi

        Console.WriteLine($"So'rov tugadi: {DateTime.Now}");
    }
}

Middleware’ni ulash
var app = builder.Build();

app.UseMiddleware<LoggingMiddleware>(); // Custom middleware
app.UseAuthentication();                // Ichki middleware
app.UseAuthorization();

app.MapControllers();
Enter fullscreen mode Exit fullscreen mode

⚡ Muhim: Middleware’lar tartibi juda muhim. Masalan:

UseAuthentication() Always UseAuthorization() dan oldin turishi kerak.

Exception handling middleware (UseExceptionHandler) boshida turadi.

Umumlashtirib aytganda

AppSettings → konfiguratsiya fayllari (umumiy va muhitga xos).

Dependency Injection → komponentlarni bir-biridan mustaqil qilish.

Middleware → so‘rov va javob jarayonida ishlovchi zanjir.

Top comments (0)