Dependency Injection در Asp.Net Core

آموزش Dependency Injection در Asp.Net Core

 

اگر تازه وارد دنیای برنامه‌نویسی ASP.NET Core شده‌اید، احتمالاً اصطلاح «Dependency Injection» یا به اختصار DI به گوشتان خورده. در این مقاله قصد دارم به زبان ساده و با مثال‌های کاربردی، مفهوم DI را توضیح بدم تا هم درک بهتری ازش داشته باشید و هم بتونید توی پروژه‌هاتون ازش استفاده کنید.

 

Dependency Injection دقیقاً چیه؟

Dependency Injection یا تزریق وابستگی، یک الگوی طراحی (Design Pattern) برای مدیریت وابستگی‌ها در برنامه‌نویسی شی‌ءگراست. به زبان ساده، وقتی یک کلاس به اشیای دیگه‌ای نیاز داره، به جای اینکه خودش اون‌ها رو بسازه، اون اشیاء از بیرون بهش داده می‌شن.

در ASP.NET Core، این قابلیت به صورت داخلی پشتیبانی می‌شه و از همون ابتدا بخشی از معماری فریم‌ورک محسوب می‌شه.

مثال روزمره:

فرض کنید شما می‌خواهید یک قهوه‌ساز بسازید. اگه قهوه‌ساز خودش مستقیم دونه قهوه و فیلتر و آب رو تولید کنه، مدیریت سخت می‌شه. اما اگه شما این مواد اولیه رو از بیرون بهش بدید، می‌تونه تمرکزشو بذاره روی قهوه ساختن. این دقیقاً کار Dependency Injection هست. حالا چجوری میتونیم از بیرون اشیاء رو به داخل یه کلاس پاس بدیم. بیاید باهم بررسی کنیم.

 

مراحل استفاده از DI در ASP.NET Core

۱. تعریف اینترفیس سرویس

 

public interface IGreeter
{
   string Greet();
}																																			

۲. پیاده‌سازی کلاس سرویس

 

public class Greeter : IGreeter
{
   public string Greet()
   {
       return "Wellcome To Diyacode";
   }
}

 

۳. ثبت سرویس در DI Container

در فایل Program.cs:

builder.Services.AddTransient<IGreeter, Greeter>();

 

۴. تزریق وابستگی در کنترلر

 

public class HomeController : Controller
{
   private readonly IGreeter _greeter;
   public HomeController(IGreeter greeter)
   {
       _greeter = greeter;
   }
   public IActionResult Index()
   {
       var message = _greeter.Greet();
       return View(message);
   }
}

 

انواع Lifetime در DI

در ASP.NET Core می‌تونید تعیین کنید که یک سرویس چه مدت در حافظه باقی بمونه:

Transient : هر بار استفاده، نمونه جدید ساخته می‌شه (مناسب سرویس‌هایی که وضعیت داخلی ندارن)

Scoped : در هر درخواست HTTP یک نمونه ساخته می‌شه (سرویس‌های مرتبط با دیتابیس یا عملیات مرتبط با درخواست)

Singleton : فقط یک بار ساخته می‌شه و برای کل عمر اپلیکیشن استفاده می‌شه (کش، لاگینگ، تنظیمات کلی)

 

مثال ثبت:

builder.Services.AddScoped<IMyService, MyService>();

 

DI فقط برای کنترلر نیست!

شما می‌تونید از DI در موارد زیر هم استفاده کنید:

  • Middleware ها
  • ViewComponent ها
  • Filter ها (مثل ActionFilter)
  • BackgroundService ها
  • حتی در Razor Page Model ها
  •  

مثال در Middleware:

 

public class MyMiddleware
{
   private readonly RequestDelegate _next;
   private readonly IGreeter _greeter;
   public MyMiddleware(RequestDelegate next, IGreeter greeter)
   {
       _next = next;
       _greeter = greeter;
   }
   public async Task InvokeAsync(HttpContext context)
   {
       var msg = _greeter.Greet();
       await context.Response.WriteAsync(msg);
       await _next(context);
   }
}

 

چرا باید از Dependency Injection در ASP.NET Core استفاده کنیم؟

مزایای DI:

  •  کاهش وابستگی کلاس‌ها به یکدیگر (Loose Coupling)
  •  افزایش قابلیت تست (Testability)
  •  کد تمیزتر و ساخت‌یافته‌تر (Clean Architecture)
  •  امکان تغییر پیاده‌سازی سرویس‌ها بدون تغییر در کلاس‌های وابسته
  •  سازگاری کامل با ASP.NET Core و ابزارهای آن مثل Middleware، Filter، Controller و غیره

 

نکاتی برای استفاده بهینه از DI

  • از interface استفاده کن تا وابستگی‌ها رو جدا نگه داری.
  • برای تست‌پذیری بهتر، constructor injection بهترین انتخابه.
  • برای سرویس‌هایی که زیاد استفاده می‌شن و نیازی به وضعیت ندارن، از Singleton استفاده کن.

 

جمع‌بندی و نتیجه‌گیری

Dependency Injection یکی از اصول مهم در برنامه‌نویسی مدرن به‌شمار میاد. در ASP.NET Core این قابلیت به صورت کامل و داخلی پشتیبانی می‌شه. با یادگیری و استفاده صحیح از DI:

  • معماری تمیزتری دارید
  • تست کردن کدهاتون راحت‌تر می‌شه
  • قابلیت نگهداری و توسعه‌ی نرم‌افزار افزایش پیدا می‌کنه

 

منابع تکمیلی:

آموزش رایگان Asp.Net Core

آموزش ویدیویی Dependency Injection

تفاوت Scope , Transient و Singleton

 

 

نوشته شده توسط :

علیرضا مقدم

نظرات کاربران