واژه های Inversion of Control و Dependency Injection Principle و Dependency Injection و حتی IoC Container اکثر اوقات در کنار هم دیده می شوند. اما آیا تفاوتی بین این چهار واژه وجود دارد؟
در این آموزش از وب سایت پرووید ما در رابطه با این چهار واژه صحبت خواهیم کرد و آنها را در قالب مثال های ساده و واقعی به شما آموزش خواهیم داد.
دقت کنید که برای فهمیدن این موضوع نیاز به این دارید که تفاوت بین Principle و Pattern را بدانید. همانطور که در تصویر بالا مشخص است Inversion of Control و Dependency Injection هر دو Design Principle های High Level ی هستند که باید در زمان طراحی کلاس های شی گرای شما استفاده شوند.
ماهیت Principle بودن آنها به این معناست که آنها فقط تعدادی Best Practice خاص را برای پیاده سازی کلاس ها به شما ارائه می دهند و هیچ جزئیاتی در رابطه با پیاده سازی (Implementation Details) فراهم نمیکنند. Dependency Injection یک Pattern است و IoC Container یک فریم ورک. در ادامه نگاهی به هر کدام از آنها خواهیم انداخت.
به بیان ساده Inversion of Control یک Design Principle است که توصیه می کند که انواع مختلفی از کنترل ها در طراحی شی گرا (Object Oriented Design) به صورت معکوس در آیند تا بتوان Loose Coupling را بین کلاس های برنامه به دست آورد. در این تعریف معنی کلمه کنترل هر مسئولیت مازادی نسبت به مسئولیت اصلی یک کلاس است.
برای مثال کنترل جریان (Flow) برنامه و یا کنترل بر روی اشیای که یک کلاس به آن وابسته هستند از قبیل کنترل ساخت یک شی از آن کلاس یا Bind کردن آن. در این رابطه حتما اصل Single Responsibility Principle از مجموعه اصول SOLID را بدانید. نکته مهمی که قصد داریم در اینجا به آن اشاره کنیم این است که اگر از روش Test Driven Development استفاده می کنید باید حتما اصل Inversion of Control را در نظر بگیرید چرا که بدون آن Test First Development غیر قابل پیاده سازی است. در رابطه با Inversion of Control در قسمت های بعدی این آموزش کامل صحبت خواهیم کرد.
اصل Dependency Inversion و یا Dependency Inversion Principle نیز می تواند به دست آوردن از Loose Coupling در بین کلاس ها به ما کمک کند. استفاده کردن از این اصل در کنار اصل Inversion of Control برای به دست آوردن از Loose Coupling شدیداً توصیه می شود. بر اساس اصل Dependency Inversion ماژول های سطح بالا (High Level Module) نباید وابسته به ماژول های سطح پایین (Low Level Module) باشند. بلکه هر دوی آنها باید به Abstraction وابسته باشند. اصل Dependency Inversion اولین بار توسط Robert C. Martin مطرح شد. وی کسی است که اولین بار اصول SOLID را نیز مطرح کرد.
تزریق وابستگی و یا Dependency Injection یک الگوی طراحی (Design Pattern) ست که اصل Inversion of Control را پیاده سازی می کند. این الگوی طراحی باعث معکوس شدن وظیفه ساخت اشیایی میشود که یک کلاس به آنها وابسته است. در رابطه با الگوی طراحی Dependency Injection در قسمت های بعدی به صورت کامل صحبت خواهیم کرد.
منبع مقاله: آموزش اصل Inversion of Control در برنامه نویسی