اکبر احمدی سرای
اکبر احمدی سرای
خواندن ۴ دقیقه·۳ ماه پیش

تزریق وابستگی (Dependency Injection) به زبان ساده

تزریق وابستگی (Dependency Injection) به زبان ساده
تزریق وابستگی (Dependency Injection) به زبان ساده

مقدمه

تصور کنید که می‌خواهید یک ماشین اسباب‌بازی بسازید. موتور، چرخ‌ها، بدنه و فرمان همگی اجزای مختلف این ماشین هستند. حالا تصور کنید که شما باید همه این اجزا را در خود ماشین جاسازی کنید و هر بار که ماشینی جدید می‌سازید، همه چیز را از اول دوباره بچینید. این کار نه تنها زمان‌بر است، بلکه اگر بخواهید چیزی را تغییر دهید، مثل جایگزینی موتور، باید کل ماشین را دوباره بازسازی کنید.

حالا، اگر بتوانید این اجزا را جداگانه بسازید و فقط در زمان نیاز، آن‌ها را به ماشین اضافه کنید، چطور؟ این کار نه تنها آسان‌تر و سریع‌تر است، بلکه امکان تغییر سریع و به‌روز‌رسانی ماشین را هم به شما می‌دهد. در دنیای برنامه‌نویسی، به این ایده "تزریق وابستگی" یا Dependency Injection می‌گویند.

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

در برنامه‌نویسی، کلاسی که مسئول انجام یک وظیفه خاص است (مثل حرکت ماشین)، ممکن است به کلاس‌های دیگری نیاز داشته باشد (مثل موتور یا چرخ‌ها). اما اگر این کلاس‌ها به صورت مستقیم در داخل کلاس اصلی ایجاد شوند، انعطاف‌پذیری کد کاهش پیدا می‌کند. اگر نیاز به تغییر یا جایگزینی یکی از این وابستگی‌ها باشد، باید بخش‌های زیادی از کد را تغییر دهید.

تزریق وابستگی به این معناست که این وابستگی‌ها (کلاس‌های دیگر) از خارج از کلاس اصلی به آن تزریق شوند، نه اینکه خود کلاس آن‌ها را ایجاد کند. به این ترتیب، اگر روزی بخواهید نوع موتور ماشین را تغییر دهید، به سادگی می‌توانید این کار را انجام دهید بدون اینکه به ساختار کلی کدتان آسیب بزنید.

انواع تزریق وابستگی

  • تزریق سازنده (Constructor Injection)
    این روش، وابستگی‌ها را از طریق سازنده کلاس به آن تزریق می‌کند. مثلاً فرض کنید شما یک کلاس Car دارید که به یک موتور نیاز دارد. شما می‌توانید موتور را از بیرون به کلاس Car تزریق کنید:

    در این مثال، Car خودش موتور را نمی‌سازد؛ بلکه موتور از بیرون به آن تزریق می‌شود. این یعنی شما می‌توانید به‌راحتی موتورهای مختلف را بدون تغییر در کلاس Car استفاده کنید.
  • تزریق خصوصیت (Property Injection)
    در این روش، وابستگی‌ها از طریق خصوصیت‌های کلاس تزریق می‌شوند. فرض کنید یک ماشین داریم که می‌تواند هر وقت نیاز داشت، یک موتور جدید را دریافت کند:

    این روش انعطاف بیشتری دارد، اما ممکن است برخی مشکلات را به همراه داشته باشد. برای مثال، ممکن است فراموش کنید موتور را به ماشین اختصاص دهید و ماشین بدون موتور بماند!
  • تزریق متد (Method Injection)
    این روش وابستگی‌ها را از طریق متدها تزریق می‌کند. فرض کنید که ماشین فقط در زمان استارت به موتور نیاز دارد:

    این روش به شما اجازه می‌دهد که فقط در زمان نیاز وابستگی‌ها را تزریق کنید، که می‌تواند در برخی موارد بسیار مفید باشد.

مزایا و معایب تزریق وابستگی

مزایا:
  • انعطاف‌پذیری بالا: می‌توانید به‌سادگی وابستگی‌های مختلف را تزریق کرده و تغییر دهید، بدون اینکه به ساختار کلی کد دست بزنید.
  • افزایش تست‌پذیری: با استفاده از تزریق وابستگی، می‌توانید به راحتی کلاس‌های خود را تست کنید. به عنوان مثال، می‌توانید در زمان تست، یک موتور مجازی (Mock) را به کلاس Car تزریق کنید تا رفتارهای مختلف آن را آزمایش کنید.
  • کاهش پیچیدگی: با جدا کردن وابستگی‌ها، کد شما خواناتر و قابل نگهداری‌تر می‌شود.
معایب:
  • پیچیدگی اولیه: برای کسانی که تازه با این مفهوم آشنا می‌شوند، ممکن است تزریق وابستگی کمی پیچیده به نظر برسد. اما با تمرین و تجربه، این پیچیدگی از بین می‌رود.
  • نیاز به دقت: در روش‌هایی مثل تزریق خصوصیت، باید دقت کنید که همه وابستگی‌های لازم تزریق شده باشند؛ وگرنه ممکن است با مشکلاتی مواجه شوید.

ک مثال واقعی

تصور کنید که یک سیستم مدیریت کاربران را می‌سازید. کلاس اصلی شما ممکن است به یک سرویس احراز هویت (AuthenticationService) و یک سرویس ایمیل (EmailService) نیاز داشته باشد. با استفاده از تزریق وابستگی، می‌توانید این سرویس‌ها را به کلاس اصلی تزریق کنید، بدون اینکه خود کلاس مسئول ایجاد و مدیریت آن‌ها باشد:

public class UserManager {
private readonly IAuthenticationService _authService;
private readonly IEmailService _emailService;
public UserManager(IAuthenticationService authService, IEmailService emailService) {
_authService = authService;
_emailService = emailService;
}
public void Register(string email, string password) {
_authService.Register(email, password);
_emailService.SendConfirmationEmail(email);
}
}

در این مثال، UserManager خودش را درگیر جزئیات احراز هویت و ارسال ایمیل نمی‌کند؛ بلکه این وظایف را به سرویس‌های مربوطه می‌سپارد که از بیرون به آن تزریق شده‌اند.


نتیجه‌گیری

تزریق وابستگی یکی از اصول مهم در توسعه نرم‌افزار است که به شما اجازه می‌دهد کدهای خود را تمیزتر، انعطاف‌پذیرتر، و تست‌پذیرتر بنویسید. با این روش، شما می‌توانید وابستگی‌های خود را مدیریت کنید و از تکرار کد جلوگیری کنید. همچنین، کدهایی که با این روش نوشته می‌شوند، به راحتی قابل گسترش و نگهداری هستند. اگرچه ممکن است در ابتدا کمی پیچیده به نظر برسد، اما با تمرین و استفاده در پروژه‌های واقعی، متوجه خواهید شد که تزریق وابستگی چقدر می‌تواند مفید و کارآمد باشد.

این مقاله با هدف توضیح مفاهیم پایه‌ای تزریق وابستگی به زبان ساده و با استفاده از مثال‌های واقعی نوشته شده است. امیدوارم که این مطالب برای شما مفید بوده باشد و بتوانید از این اصول در پروژه‌های خود استفاده کنید.

تزریق وابستگیبرنامه نویسیمعماری نرم افزار
توسعه دهنده ارشد نرم افزار
شاید از این پست‌ها خوشتان بیاید