حالا که ایده‌ای از وابستگی‌ها داریم، بیایید نگاه کنیم به **dependency injection**.
این چیه؟
خب، **dependency injection** یا DI، یک الگوی طراحی است که برای رسیدن به **وارونگی کنترل** یا همان
IOC بین کلاس‌ها و وابستگی‌های آن‌ها استفاده می‌شود.
به جای اینکه یک کلاس خودش وابستگی‌هایش را ایجاد کند، این وابستگی‌ها از بیرون تأمین می‌شوند.
راه ساده‌تر برای توضیح این است: مثل استفاده از **سازنده‌ای** که در ویدیوی قبلی ساختیم، به جای اینکه
سازنده برود ابزارها را بخرد، کسی ابزارها را برای سازنده می‌آورد.
به این ترتیب، سازنده می‌تواند روی ساختن تمرکز کند بدون اینکه نگران چگونگی گرفتن ابزارها باشد.
و انواع مختلفی از **dependency injection** وجود دارد.
یکی **constructor injection** است که در این ویدیو نگاه می‌کنیم، جایی که وابستگی‌ها از طریق **سازنده کلاس** تأمین می‌شوند.
در سازنده ابزارهایی مثل **اره** یا **چکش** و غیره را منتقل می‌کنید.
بعد، **setter injection** وجود دارد که وابستگی‌ها از طریق یک **ویژگی** یا **متد** تأمین می‌شوند، و
سپس **interface injection** که وابستگی‌ها از طریق اینترفیس که کلاس پیاده‌سازی می‌کند تأمین می‌شوند.
خُب.
بیایید مثال خودمان از ویدیوی قبلی را ببینیم.
و بفهمیم **dependency injection** مخصوصاً با **constructor injection** چطور کار می‌کند.
در مثال ما، هیچ **dependency injection**‌ای استفاده نشده بود.
پس ما یک وابستگی داشتیم ولی آن را **inject** نکرده بودیم.
چطور می‌توانیم کلاس **سازنده** را تغییر دهیم تا از **dependency injection** استفاده کند؟
می‌توانیم این کار را با گفتن این جمله انجام دهیم: «مثلاً هر وقت می‌خواهی از من به عنوان سازنده استفاده کنی، باید **چکش** به من بدهی،
چون من فقط می‌روم سر کارم، مثل اینکه فقط کارم را انجام می‌دهم، می‌روم به **محل ساخت و ساز**.
ولی
تو باید ابزارها را به من بدهی، چون در غیر این صورت نمی‌توانم کارم را انجام دهم.
باشه؟
پس باید به من چکش بدهی و باید اره‌ام و هر ابزار دیگری که داریم بدهی.
حالا، به جای اینکه سازنده مسئول ایجاد وابستگی‌هایش باشد، حالا این کار از طریق **dependency injection** اتفاق می‌افتد.
پس
ما چکش را به سازنده **inject** می‌کنیم با گفتن: «باشه، هر وقت از تو استفاده کنم، چکش را به تو می‌دهم، و اره را هم هر وقت از تو استفاده کنم می‌دهم.»
باشه.
این الان همان **constructor injection** یا DI است.
**dependency injection** DI، عالیه.
واقعا جالب.
حالا اگر بخواهم از سازنده‌ام استفاده کنم، اگر بخواهم خانه‌ام را بسازد و بخواهم از روش‌های او استفاده کنم،
در واقع، می‌خواهم از روش‌های او برای تکمیل خانه‌ام استفاده کنم.
خب، پس باید ابزارها مثل **چکش** و **اره** و غیره را به او بدهیم.
حالا می‌توانیم یک چکش بسازیم:
چکش، چکش جدید، و می‌توانیم بگوییم اره، اره جدید، و می‌توانیم بگوییم سازنده، سازنده جدید.
و ما چکش و اره را به سازنده **inject** می‌کنیم.
حالا می‌توانیم فقط از سازنده برای انجام روش‌هایش مثل ساختن خانه استفاده کنیم.
بیایید این مثال را اجرا کنیم و ببینیم چه اتفاقی می‌افتد.
و خواهیم دید که هیچ چیزی نمی‌بینیم چون اینجا **ReadLine** یا **ReadKey** نداریم.
پس دوباره اجرا می‌کنیم.
و می‌بینیم: **چکش زدن میخ‌ها، اره کردن چوب، خانه ساخته شد**.
عالی.
اگر همیشه اینقدر ساده بود، فکر می‌کنم اره کردن چوب باید قبل از چکش زدن می‌آمد، ولی به هر حال.
خُب، در این مورد دیدیم که **dependency injection** با **constructor injection** چگونه کار می‌کند.
امیدوارم از این ویدیو لذت برده باشید.
حالا می‌دانید **dependency injection** چیست، حداقل با یک مثال خیلی ساده اینجا. ---