همهی این الگوهای برنامهنویسی، مربوط به مفهوم Dependency Injection هستند که در زبانهای برنامهنویسی مختلف مورد استفاده قرار میگیرند.
در الگوی DI (Dependency Injection)، مسئولیت ایجاد شیء وابستگیهای آن به دسترسی به دیگر شیءها را به یک سرویسگیرنده (Service Consumer) منتقل میکنیم. به این صورت که به جای اینکه سرویسگیرنده خودش شیء مورد نیازش را ایجاد کند، آن شیء را از طریق پارامترهایی که به متد سازنده یا متدهای دیگر ماژول ارسال میکنیم، دریافت میکند.
درالگوی IoC (Inversion of Control)، کنترل اجرای برنامه از دست برنامهنویس خارج شده و به یک کتابخانه یا چارچوب نرمافزار مانند Spring Framework و Unity Container منتقل شده است. در این الگو، کتابخانه یا چارچوب نرمافزار برای مدیریت تمامی اجزای برنامه و ایجاد اتصالات بین آنها و اجرای لازم برنامه مسئولیت دارد.
در الگوی DI Container (Dependency Injection Container)، یک کتابخانه یا چارچوب نرمافزار برای مدیریت و ایجاد شیءهایی که به یکدیگر وابسته هستند مسئولیت دارد. این الگو به برنامهنویس این امکان راهداف مربوط به توسعهی اپلیکیشن، برای رسیدن به یک نتیجهی مشخص و مطلوب، تعریف میشود و شامل چندین مرحله است. برخی از اهداف مهم توسعهی اپلیکیشن عبارتند از:
برآوردن نیازهای کاربران: یکی از مهمترین اهداف توسعهی اپلیکیشن، برآوردن نیازهای کاربران است. برای رسیدن به این هدف، تیم توسعهی باید با کاربران و مشتریان برای درک نیازهای آنها ارتباط برقرار کند و بر اساس آن، ویژگیها و امکانات مورد نیاز را در اپلیکیشن پیادهسازی کند.
ارائهی یک راه حل مناسب: برای رسیدن به این هدف، تیم توسعهی باید برای پیادهسازی اپلیکیشن، یک راه حل مناسب و بهینه ارائه دهد. برای این کار، تیم توسعهی باید با تکنولوژیهای جدید و بهروز آشنا باشد و بر اساس نیازهای اپلیکیشن، از آنها استفاده کند.
افزایش کیفیت و کارایی: یکی از اهداف مهم توسعهی اپلیکیشن، افزایش کیفیت و کارایی آن است. برای رسیدن به این هدف، تیم توسعهی باید از بهترین روشهای پیادهسازی و با استفاده از اصول و مفاهیم بهروز استفاده کند. الگوی DI Container به برنامهنویس این امکان را میدهد تا با استفاده از یک کتابخانه یا چارچوب نرمافزار، کد خود را به صورت ماژولار پیادهسازی کند و برای ایجاد اتصالات بین اجزای مختلف برنامه از Dependency Injection استفاده کند. در این الگو، کتابخانه یا چارچوب نرمافزار برای مدیریت و ایجاد شیءهایی که به یکدیگر وابسته هستند مسئولیت دارد و برنامهنویس میتواند با استفاده از این الگو، کد خود را به صورت قابل و ماژولار پیادهسازی کند و برای ایجاد اتصالات بین اجزای مختلف برنامه از Dependency Injection استفاده کند. در این الگو، کتابخانه یا چارچوب نرمافزار برای مدیریت و ایجاد شیءهایی که به یکدیگر وابسته هستند مسئولیت دارد و برنامهنویس میتواند با استفاده از این الگو، کد خود را به صورت قابل توسعه و قابل انعطاف پیادهسازی کند.
-----------------------
DI یا Dependency Injection، IoC یا Inversion of Control و Container یا DI Container هر سه مفهوم مستقل و مختلفی هستند، اما با هم ارتباط دارند:
Dependency Injection (DI):
DI به معنی تزریق وابستگیها است و به این معنی است که یک شیء میتواند وابستگیهای خود را به جای این که خودش آنها را ایجاد کند، به شیء دیگری با این وظیفه بسپارد. به عبارت دیگر، شیء مورد نظر خودش نمیتواند وابستگیهای خود را بسازد، بلکه آنها را از منابع خارجی دریافت میکند.
Inversion of Control (IoC):
IoC به معنی برعکس کردن کنترل است و به این معنیاست که کنترل اجرای برنامه از سمت شیء اصلی به شیء دیگری منتقل میشود. در IoC، شیء اصلی کنترل برنامه را به جای آن که خودش کد را اجرا کند، به شیء دیگری منتقل میکند. به عبارت دیگر، در IoC، شیء اصلی برای اجرای کد خود به شیء دیگری وابسته میشود.
DI Container:
DI Container یا اینورتر کنترل به عنوان یک container برای مدیریت وابستگیهای یک برنامه استفاده میشود. این کانتینر قادر است که وابستگیهای موجود در یک برنامه را مدیریت کند و در زمان لازم آنها را به شیءهای دیگر تزریق کند. بدین ترتیب، DI Container با استفاده از مکانیزم DI، کنترل اجرای برنامه را تغییر میدهد و به جای این که شیء اصلی وابستگیهای خود را ایجاد کند، از DI Container برای دریافت وابستگیهای خود استفاده میکند.
به طور خلاصه، Dependency Injection (DI) و Inversion of Control (IoC) دو مفهوم مستقل و مختلف هستند، که هر دو به منظور کاهش وابستگیهای بین کلاسها و ماژولهای یک برنامه استفاده میشوند. در حالی که DI Container به عنوان یک container برای مدیریت وابستگیهای یک برنامه استفاده میشود و با استفاده ازمکانیزم DI، وابستگیها را در زمان اجرای برنامه تزریق میکند. به عبارت دیگر، DI Container یک ابزار است که به شیء اصلی کمک میکند تا وابستگیهای خود را مدیریت کند و به شیءهای دیگر تزریق کند.