ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

Dependency Injection درNET. : مفاهیم، پیاده‌سازی و بهترین روش‌ها

مقدمه: چرا در برنامه نویسی Dependency Injection اهمیت دارد؟

Dependency Injection (DI) یکی از مهم‌ترین الگوهای طراحی در برنامه‌نویسی شی‌ءگرا است که در NET Core. و NET 5. به‌صورت پیش‌فرض پشتیبانی می‌شود.

این تکنیک باعث کاهش وابستگی‌ها، افزایش قابلیت تست‌پذیری و بهبود مدیریت منابع در پروژه‌های نرم‌افزاری می‌شود.

در این مقاله، مفهوم DI، روش‌های پیاده‌سازی آن در دات نت و بهترین شیوه‌های استفاده از آن را بررسی خواهیم کرد.

اگر می خواهید با شیوهای کدنویسی تمیز در سی شارپ آشنا بشید پیشنهاد می شود نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

Dependency Injection چیست؟

در برنامه‌های شی‌ءگرا، کلاس‌ها معمولاً برای انجام وظایف خود به سایر کلاس‌ها وابسته هستند.

اگر یک کلاس مستقیماً نمونه‌ای از یک کلاس دیگر را ایجاد کند، وابستگی سخت‌کد شده (Hardcoded Dependency) ایجاد می‌شود که مدیریت تغییرات و تست‌پذیری را دشوار می‌کند.

Dependency Injection (DI) این مشکل را حل می‌کند.

به جای این‌که کلاس‌ها مستقیماً نمونه‌سازی شوند، آن‌ها از بیرون دریافت می‌شوند.

این کار از طریق سه روش اصلی انجام می‌شود

۱. Constructor Injection (تزریق وابستگی از طریق سازنده)​

۲. Property Injection (تزریق وابستگی از طریق ویژگی‌ها)

۳. Method Injection (تزریق وابستگی از طریق متدها)

انواع روش‌های تزریق وابستگی در #C

۱. Constructor Injection (تزریق وابستگی از طریق سازنده)

این رایج‌ترین روش در NET Core. است.

در این روش، وابستگی‌ها از طریق سازنده (Constructor) کلاس دریافت می‌شوند.

				
					public interface IMessageService
{
    void SendMessage(string message);
}

public class EmailService : IMessageService
{
    public void SendMessage(string message)
    {
        Console.WriteLine($"Email sent: {message}");
    }
}

public class NotificationService
{
    private readonly IMessageService _messageService;

    public NotificationService(IMessageService messageService)
    {
        _messageService = messageService;
    }

    public void Notify(string message)
    {
        _messageService.SendMessage(message);
    }
}
				
			

۲. Property Injection (تزریق وابستگی از طریق ویژگی‌ها)

در این روش، وابستگی‌ها از طریق ویژگی‌ها (Properties) تزریق می‌شوند.

				
					public class NotificationService
{
    public IMessageService MessageService { get; set; }
    
    public void Notify(string message)
    {
        MessageService?.SendMessage(message);
    }
}
				
			

۳. Method Injection (تزریق از طریق متدها)

در این روش، وابستگی مستقیماً به یک متد خاص ارسال می‌شود.

				
					public class NotificationService
{
    public void Notify(string message, IMessageService messageService)
    {
        messageService.SendMessage(message);
    }
}
				
			

پیاده‌سازی Dependency Injection در ASP.NET Core

۱. ثبت وابستگی‌ها در DI Container

در .NET Core، تمامی وابستگی‌ها باید در DI Container ثبت شوند.

این کار در متد ConfigureServices در Program.cs انجام می‌شود.

				
					var builder = WebApplication.CreateBuilder(args);

// Sapt va Vabastegi
builder.Services.AddScoped<IMessageService, EmailService>();
builder.Services.AddScoped<NotificationService>();

var app = builder.Build();
				
			

۲. تزریق وابستگی در کنترلرها (Controllers)

				
					[ApiController]
[Route("api/[controller]")]
public class NotificationController : ControllerBase
{
    private readonly NotificationService _notificationService;

    public NotificationController(NotificationService notificationService)
    {
        _notificationService = notificationService;
    }

    [HttpPost("send")]
    public IActionResult Send(string message)
    {
        _notificationService.Notify(message);
        return Ok("Message Sent!");
    }
}
				
			

Scopeهای مختلف در Dependency Injection

نوع ثبت توضیح
AddSingleton<T> یک نمونه از سرویس در کل عمر برنامه استفاده می‌شود.
AddScoped<T> یک نمونه از سرویس برای هر درخواست HTTP ایجاد می‌شود.
AddTransient<T> هر بار که نیاز باشد، یک نمونه جدید ایجاد می‌شود.

مزایای استفاده از Dependency Injection

✔ کاهش وابستگی‌های سخت‌کد شده (Loose Coupling)
✔ افزایش قابلیت تست‌پذیری (Testability)
✔ مدیریت بهتر وابستگی‌ها در طول عمر برنامه
✔ پشتیبانی داخلی در NET Core. بدون نیاز به فریمورک‌های جانبی

سوالات متداول درباره Dependency Injection در NET.

Dependency Injection باعث کاهش وابستگی‌های سخت‌کد شده بین کلاس‌ها می‌شود، تست‌پذیری کد را افزایش می‌دهد، قابلیت نگه‌داری و تغییرات در برنامه را ساده‌تر می‌کند و به بهبود ساختار کد کمک می‌کند.

  • AddSingleton<T>: یک نمونه از سرویس در کل مدت اجرای برنامه استفاده می‌شود.
  • AddScoped<T>: در هر درخواست HTTP یک نمونه جدید از سرویس ایجاد می‌شود.
  • AddTransient<T>: هر بار که به سرویس نیاز باشد، یک نمونه جدید ایجاد می‌شود.

بله، می‌توان چندین پیاده‌سازی از یک اینترفیس را ثبت کرد و از Named Services یا Factory Pattern برای انتخاب پیاده‌سازی مناسب استفاده کرد.

IoC یک اصل کلی است که کنترل ایجاد اشیا را از کلاس‌های وابسته می‌گیرد و به یک Container واگذار می‌کند.

Dependency Injection یکی از پیاده‌سازی‌های IoC است که وابستگی‌ها را به کلاس‌ها تزریق می‌کند.

با استفاده از Mocking Frameworks مانند Moq می‌توان وابستگی‌های کلاس را شبیه‌سازی کرد و رفتارهای مختلف را بدون اجرای واقعی آن‌ها تست کرد.

این کار به افزایش کیفیت تست‌ها کمک می‌کند.

نتیجه‌گیری

Dependency Injection در NET. یک تکنیک مهم برای مدیریت وابستگی‌ها است که باعث کاهش وابستگی‌های مستقیم بین کلاس‌ها، بهبود تست‌پذیری و افزایش انعطاف‌پذیری کد می‌شود.

با استفاده از AddSingleton، AddScoped و AddTransient می‌توان بهینه‌ترین روش مدیریت سرویس‌ها را در برنامه‌های ASP.NET Core پیاده‌سازی کرد.

📢 اگر شما هم تجربه ای در برنامه نویسی و استفاده از DI را دارید در بخش کامنت‌ها آن را به اشتراک بگذارید! 🚀

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *