‫‫‫Inversion of Control چیست؟

تا حالا شده که به خاطر دیدن نمونه کد یا یک روش نامانوس از خیر خواندن یا استفاده از سورس کدی گذشته باشید؟ حتی اگر مطمئن باشید آن چیز نامفهوم می‌تواند ابزار مناسبی برایتان باشد؟ یکی از نمونه کدهایی که همیشه مرا از کار روی بعضی سورس کدها فراری داده IoC.Resolve(“serverform”)‎ است.

همان طور که می‌توان از ظاهر این خط کد حدس زد، موضوع مربوط می‌شود به Inversion of Control با استفاده از Castle Windsor. مفهوم IoC ارتباط تنگانگی با Dependency Injection (همان DI) دارد. این دو مفهوم به طور خلاصه design patternهایی هستند که با کاهش وابستگی بین اجزا مختلف نرم‌افزار و اتوماتیک کردن روال instance گیری‌های طولانی از کلاس‌ها و interfaceهای مختلف به تولید نرم‌افزارهایی که تست و نگهداری راحت‌تری دارند کمک می‌کند.

به عنوان مثال فرض کنید کلاسی به اسم HtmlTitleRetriever دارید که constructor آن به دو اینترفیس IFileDownloader و ITitleScraper نیاز دارد. روش instance گرفتن از کلاس HtmlTitleRetriever بدون استفاده از IoC به شکل زیر است:

IFileDownloader downloader = new HttpFileDownloader();
ITitleScraper scraper = new StringParsingTitleScraper();
HtmlTitleRetriever retriever = new HtmlTitleRetriever(downloader, scraper);
حال با استفاده از IoC و مشخص کردن بعضی تنظیمات در app.config می‌توان از روش زیر برای instance گیری استفاده کرد:

HtmlTitleRetriever retriever = container.Resolve<HtmlTitleRetriever>();
این روش هم کد نویسی را خلاصه‌تر و راحت‌تر می‌کند و هم امکان توسعه و تغییر برنامه را در آینده می‌دهد بدون آن که نیاز به build و دستکاری مجدد باشد.

پ.ن.: این نوشته در واقع خلاصه‌ای از مطلب «Inversion of Control and Dependency Injection with Castle Windsor Container – Part I» می‌باشد.