تصور کنید که میخواهید یک ماشین اسباببازی بسازید. موتور، چرخها، بدنه و فرمان همگی اجزای مختلف این ماشین هستند. حالا تصور کنید که شما باید همه این اجزا را در خود ماشین جاسازی کنید و هر بار که ماشینی جدید میسازید، همه چیز را از اول دوباره بچینید. این کار نه تنها زمانبر است، بلکه اگر بخواهید چیزی را تغییر دهید، مثل جایگزینی موتور، باید کل ماشین را دوباره بازسازی کنید.
حالا، اگر بتوانید این اجزا را جداگانه بسازید و فقط در زمان نیاز، آنها را به ماشین اضافه کنید، چطور؟ این کار نه تنها آسانتر و سریعتر است، بلکه امکان تغییر سریع و بهروزرسانی ماشین را هم به شما میدهد. در دنیای برنامهنویسی، به این ایده "تزریق وابستگی" یا Dependency Injection میگویند.
در برنامهنویسی، کلاسی که مسئول انجام یک وظیفه خاص است (مثل حرکت ماشین)، ممکن است به کلاسهای دیگری نیاز داشته باشد (مثل موتور یا چرخها). اما اگر این کلاسها به صورت مستقیم در داخل کلاس اصلی ایجاد شوند، انعطافپذیری کد کاهش پیدا میکند. اگر نیاز به تغییر یا جایگزینی یکی از این وابستگیها باشد، باید بخشهای زیادی از کد را تغییر دهید.
تزریق وابستگی به این معناست که این وابستگیها (کلاسهای دیگر) از خارج از کلاس اصلی به آن تزریق شوند، نه اینکه خود کلاس آنها را ایجاد کند. به این ترتیب، اگر روزی بخواهید نوع موتور ماشین را تغییر دهید، به سادگی میتوانید این کار را انجام دهید بدون اینکه به ساختار کلی کدتان آسیب بزنید.
انواع تزریق وابستگی
Car
دارید که به یک موتور نیاز دارد. شما میتوانید موتور را از بیرون به کلاس Car
تزریق کنید:Car
خودش موتور را نمیسازد؛ بلکه موتور از بیرون به آن تزریق میشود. این یعنی شما میتوانید بهراحتی موتورهای مختلف را بدون تغییر در کلاس Car
استفاده کنید.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
خودش را درگیر جزئیات احراز هویت و ارسال ایمیل نمیکند؛ بلکه این وظایف را به سرویسهای مربوطه میسپارد که از بیرون به آن تزریق شدهاند.
تزریق وابستگی یکی از اصول مهم در توسعه نرمافزار است که به شما اجازه میدهد کدهای خود را تمیزتر، انعطافپذیرتر، و تستپذیرتر بنویسید. با این روش، شما میتوانید وابستگیهای خود را مدیریت کنید و از تکرار کد جلوگیری کنید. همچنین، کدهایی که با این روش نوشته میشوند، به راحتی قابل گسترش و نگهداری هستند. اگرچه ممکن است در ابتدا کمی پیچیده به نظر برسد، اما با تمرین و استفاده در پروژههای واقعی، متوجه خواهید شد که تزریق وابستگی چقدر میتواند مفید و کارآمد باشد.
این مقاله با هدف توضیح مفاهیم پایهای تزریق وابستگی به زبان ساده و با استفاده از مثالهای واقعی نوشته شده است. امیدوارم که این مطالب برای شما مفید بوده باشد و بتوانید از این اصول در پروژههای خود استفاده کنید.