اگر تازه وارد دنیای برنامهنویسی ASP.NET Core شدهاید، احتمالاً اصطلاح «Dependency Injection» یا به اختصار DI به گوشتان خورده. در این مقاله قصد دارم به زبان ساده و با مثالهای کاربردی، مفهوم DI را توضیح بدم تا هم درک بهتری ازش داشته باشید و هم بتونید توی پروژههاتون ازش استفاده کنید.
Dependency Injection یا تزریق وابستگی، یک الگوی طراحی (Design Pattern) برای مدیریت وابستگیها در برنامهنویسی شیءگراست. به زبان ساده، وقتی یک کلاس به اشیای دیگهای نیاز داره، به جای اینکه خودش اونها رو بسازه، اون اشیاء از بیرون بهش داده میشن.
در ASP.NET Core، این قابلیت به صورت داخلی پشتیبانی میشه و از همون ابتدا بخشی از معماری فریمورک محسوب میشه.
فرض کنید شما میخواهید یک قهوهساز بسازید. اگه قهوهساز خودش مستقیم دونه قهوه و فیلتر و آب رو تولید کنه، مدیریت سخت میشه. اما اگه شما این مواد اولیه رو از بیرون بهش بدید، میتونه تمرکزشو بذاره روی قهوه ساختن. این دقیقاً کار Dependency Injection هست. حالا چجوری میتونیم از بیرون اشیاء رو به داخل یه کلاس پاس بدیم. بیاید باهم بررسی کنیم.
public interface IGreeter
{
string Greet();
}
public class Greeter : IGreeter
{
public string Greet()
{
return "Wellcome To Diyacode";
}
}
در فایل 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);
}
}
در ASP.NET Core میتونید تعیین کنید که یک سرویس چه مدت در حافظه باقی بمونه:
Transient : هر بار استفاده، نمونه جدید ساخته میشه (مناسب سرویسهایی که وضعیت داخلی ندارن)
Scoped : در هر درخواست HTTP یک نمونه ساخته میشه (سرویسهای مرتبط با دیتابیس یا عملیات مرتبط با درخواست)
Singleton : فقط یک بار ساخته میشه و برای کل عمر اپلیکیشن استفاده میشه (کش، لاگینگ، تنظیمات کلی)
مثال ثبت:
builder.Services.AddScoped<IMyService, MyService>();
شما میتونید از DI در موارد زیر هم استفاده کنید:
مثال در 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);
}
}
مزایای DI:
Dependency Injection یکی از اصول مهم در برنامهنویسی مدرن بهشمار میاد. در ASP.NET Core این قابلیت به صورت کامل و داخلی پشتیبانی میشه. با یادگیری و استفاده صحیح از DI:
آموزش ویدیویی Dependency Injection
تفاوت Scope , Transient و Singleton
نوشته شده توسط :
علیرضا مقدم