یکی دیگر از مهمترین اصول در توسعه نرمافزارهای موفق اصل Dependency Inversion می باشد. در همین ابتدای کار خدمت شما عرض میکنیم که در صورت تمایل می توانید از بسته ی آموزش ویدئویی Inversion of Control و IoC Container ها و آموزش ویدئویی تزریق وابستگی (Dependency Injection) در برنامه نویسی شی گرا استفاده کنید. بر اساس اصل Dependency Inversion و یا معکوس سازی وابستگی، جهت وابستگی های درون یک اپلیکیشن می بایست به سمت abstraction ها باشد نه به سمت implementation details ها. منظور از abstraction در زبان برنامه نویسی سی شارپ یک Interface و یا کلاس Abstract که به منظور از implementation details پیاده سازی آن ها می باشد. بسیاری از اپلیکیشن ها به شکلی نوشته میشوند که dependency های زمان کامپایل به سمت اجرای زمان Runtime ترتیب داده شده اند. این موضوع باعث می شود که چه یک گراف وابستگی مستقیم ایجاد بشود. برای درک هرچه بهتر این موضوع فرض کنید که ماژول A یک تابع در ماژول B را صدا میزند که این تابع نوبه خود یک تابع در ماژول C را صدا میزند. این موضوع باعث میشود تا در زمان کامپایل شدن برنامه ماژول A به ماژول B وابستگی داشته باشد و ماژول B نیز به نوبه خود به ماژول C وابستگی داشته باشند. به این نوع از وابستگی، وابستگی مستقیم و یا direct میگوییم و حال قرار است که با استفاده از اصل Dependency Inversion این وابستگی مستقیم معکوس بگردد. لطفاً تصویر زیر را ببینید
حال با پیاده سازی کردن اصل Dependency Inversion میتوانیم طوری عمل کنیم که ماژول A متد هایی را از درون یک Abstraction صدا بزنند که ماژول B آن را پیاده سازی می کند. این موضوع باعث میشود که ماژول A بتواند در زمان Runtime از ماژول B استفاده کند اما ماژول B به یک Interface که توسط ماژول A کنترل میشود وابسته شده است. این کنترل شدن در زمان Compile Time اتفاق افتاده است. پس تا به اینجای کار توانسته ایم Compile Time Dependency و یا همان وابستگی زمان کامپایل را معکوس کنیم. در زمان اجرا جریان اجرا شدن برنامه بدون تغییر باقی میماند اما استفاده کردن از Interface ها می تواند به ما این امکان را بدهد تا پیاده سازی های مختلفی از آنها را به سادگی در درون برنامه قرار بدهیم. برای درک هرچه بهتره Dependency Inversion ما توصیه میکنیم از بسته ی آموزش ویدئویی Inversion of Control و IoC Container ها و آموزش ویدئویی تزریق وابستگی (Dependency Injection) در برنامه نویسی شی گرا استفاده کنید. لطفاً تصویر زیر را ببینید.
حال با پیاده سازی کردن اصل Dependency Inversion میتوانیم طوری عمل کنیم که ماژول A متد هایی را از درون یک Abstraction صدا بزنند که ماژول B آن را پیاده سازی می کند. این موضوع باعث میشود که ماژول A بتواند در زمان Runtime از ماژول B استفاده کند اما ماژول B به یک Interface که توسط ماژول A کنترل میشود وابسته شده است. این کنترل شدن در زمان Compile Time اتفاق افتاده است. پس تا به اینجای کار توانسته ایم Compile Time Dependency و یا همان وابستگی زمان کامپایل را معکوس کنیم. در زمان اجرا جریان اجرا شدن برنامه بدون تغییر باقی میماند اما استفاده کردن از Interface ها می تواند به ما این امکان را بدهد تا پیاده سازی های مختلفی از آنها را به سادگی در درون برنامه قرار بدهیم. برای درک هرچه بهتره Dependency Inversion ما توصیه میکنیم از بسته ی آموزش ویدئویی Inversion of Control و IoC Container ها و آموزش ویدئویی تزریق وابستگی (Dependency Injection) در برنامه نویسی شی گرا استفاده کنید. لطفاً تصویر زیر را ببینید.
اصل Dependency Inversion یک موضوع بسیار ضروری و حیاتی برای ایجاد کردن اپلیکیشن های loosely coupled به حساب میآیند. دلیل این موضوع نیز در این است که implementation detail ها می توانند به شکلی نوشته شوند که به Abstract های سطح بالا وابسته باشند و آنها را پیاده سازی کنند. اپلیکیشن هایی که با پیادهسازی کردن اصل Dependency Inversion توسعه داده میشوند قابلیت تست پذیری بالاتری دارند، ماژولار هستند و در نتیجه قابلیت نگهداری بالاتری را نیز دارا خواهند بود. استفاده کردن از Dependency Injection نیز با در نظر گرفتن اصل Dependency Inversion امکانپذیر خواهد بود. موضوع آخر نیز اینکه در تکنولوژی ASP.NET Core به صورت درونی از Dependency Injection پشتیبانی می شود که احتمالاً در آینده یک بسته آموزشی در رابطه با این موضوع بر روی وبسایت پرووید قرار خواهد گرفت.