شنبه , ۳۰ شهریور ۱۳۹۸
Dependency-Injection-DI-and-Inversion-of-Control
Dependency-Injection-DI-and-Inversion-of-Control
خانه - #C - آشنایی با تزریق وابستگی ها (IOC,DI)

آشنایی با تزریق وابستگی ها (IOC,DI)

درک بسیاری از مفاهیم واقعا مشکل است ولی در واقع خیلی آسان به طور روزمره از آن ها استفاده می کنیم.در پست قبلی در رابطه با اصول SOLID صحبت کردیم. امروز، من می خواهم در مورد مسئله وابستگی ها در برنامه نویسی صحبت کنم و روش هایی که این مشکل را رفع می کنند.

این مقاله برای مخاطبانی است که علاقمند به شناختن یکی از مهمترین اصول شی گرایی هستند اما در هنگام اجرا و استفاده از آن کمی گیج هستند.

امروز یاد می گیریم

معکوس سازی کنترل (IOC) چیست؟
تزریق وابستگی (DI) به چه معناست؟
راه های دستیابی به تزریق وابستگی…
مزایای اجرا و پیروی از این اصل

معکوس سازی جریان کنترل (Inversion Of Control)

تصویر بالا را همه در دانشگاه و دبیرستان دیده ایم!در دانشگاه معمولا رویداد های سازمان یافته و کسل کننده ای مثل همیشه برگذار می گردد.امیدوارم ارتباط بین دانشگاه و رویداد های آن را فهمیده باشید.به کد زیر نگاه کنید.

Inversion of Control

همانطور که میبینید در کد بالا کلاس کالج دارای یک نمونه از کلاس رویداد است.مشکلاتی که این کد دارد عبارتند از:

  1. کلاس ها در هم آمیخته شده اند، یعنی ما نمی توانیم یک کلاس کالج بدون کلاس رویداد بسازیم.کلاس رویداد در سازنده کلاس کالج حضور دارد و در آنجا ساخته می شود.
  2. اگر ما نیاز داشته باشیم که یک رویداد را تغییر دهیم باید یا دوباره کد را کامپایل کنیم یا کلاس کالج را نیز ویرایش کنیم.
  3. کلاس کالج روی ایجاد شدن رویداد ها کنترل کامل دارد. حال اگر در این حین یک رویداد جدید ایجاد شود نیاز داریم تا کلاس کالج را دوباره به گونه ای تغییر دهیم که به آن رویداد اشاره کند.

کلاس کالج باید بگونه ای باشد که بتواند هر نوع رویدادی را بپذیرد.برای حل مشکل باید کنترل روی رویداد ها را به قسمت جدیدی منتقل کنیم. این همان چیزی است که به آن معکوس سازی کنترل (Inversion Of Control) می گوییم.به عبارتی کلاس کالج نباید نوع رویداد را مشخص کند بلکه فقط یک ماهیت از نوع رویداد (interface) را درخواست می کند و کلاسی دیگر انواع مختلف رویداد را برای او ارسال می کند.

 

تزریق وابستگی ها (Dependency Injection)

معکوس سازی کنترل را می توان با استفاده از تزریق وابستگی یا همون DI انجام داد.ایده اصلی DI کم کردن وابسگی بین کلاس ها به این صورت که وابستگی هایی که یک کلاس دارد را در آن تزریق کنیم آن هم از نوعی ک لازم دارد . به جای اینکه از آنها در خود کلاس استفاده کنیم.

Dependency Injection را می توان به چهار روش استفاده کرد.

  1. تزریق به وسیله سازنده کلاس
  2. تزریق به وسیله پروپرتی ها
  3. تزریق به وسیله متد ها
  4. تزریق با Service Locator

 

تزریق به وسیله سازنده کلاس

این همان روشی بود که در بالا از آن استفاده کردیم به این صورت که وابستگی از طریق سازنده به کلاس تزریق می شود.

class College  
{  
        private IEvent _events;  
        public College(IEvent ie)  
        {  
            _events = ie;        
        }  
 
       public void GetEvents()  
        {  
            this._events.LoadEventDetail();  
        }  
}

همانطور که در بالا می بینین کلاس کالج می تواند هر نوع رویدادی را که تعریف می شود بپذیرد ولی اشکال این روش آنجاست که کلاس کالج دیگر نمی تواند از سازنده پیش فرض خود بهره ببرد زیرا همیشه برای یک کالج یک رویداد باید باشد صرف نظر از نوع رویداد.

تزریق به وسیله پروپرتی ها

در این روش به جای اینکه از سازنده کلاس استفاده کنیم از متد set اعضای کلاس استفاده می کنیم همانند کد زیر که میبینید می توان هنگام استفاده از کلاس کالج به آن رویداد اضافه کرد یا خیر.

class College  
{  
        private IEvent _events;  
        public IEvent MyEvent  
        {  
            set  
            {  
                _events = value;  
            }  
        }  
}

وقتی هم داریم از  آن استفاده می کنیم. می توانیم از سازنده پیش فرض کلاس استفاده کنیم.

College coll = new College();  
coll.MyEvent = new FootballEvent();

 

تزریق به وسیله متد ها

این روش همانند روش سازنده کلاس است با این تفاوت که به جای استفاده از سازنده کلاس از یک متد با دسترسی عمومی استفاده می کنیم

class College  
{  
        private IEvent _events;  
        public void GetEvent(IEvent myevent)  
        {  
            this._events = myevent;            
        }  
}

برای استفاده از این روش خیلی ساده یک نمونه از کلاس ساخته و متد آن را صدا می زنیم.

College coll = new College();  
coll.GetEvent(new FootballEvent());

تزریق با Service Locator

در این روش یک کلاس واسط به نام EventLocator بین کلاس کالج و رویداد قرار می گیرد که در آن ما فقط لازم است شماره رویداد را وارد کنیم. و EventLocator خودش مقادیر رویداد را برای ما بر میگرداند.

class College  
    {  
        private IEvent _events = null;  
        EventLocator el = new EventLocator();  
        public College(int index)  
        {  
            this._events = el.LocateEvent(index);  
        }  
    }  
    class EventLocator  
    {  
        public IEvent LocateEvent(int index)  
        {  
            if (index == ۱)  
                return new FootballEvent();  
            else if (index == ۲)  
                return new PartyEvent();  
            else  
                return new TechEvents();  
        }  
   }

و برای استفاده نیز فقط لازم است تا براحتی یک نمونه از کلاس کالج ساخته و ایندکس رویداد را برای آن ارسال کنیم.

College coll = new College(1);  
coll.GetEvents();

مزایای استفاده از این روش

  1. جداسازی کلاس ها و کم شدن وابستگی ها
  2. توانایی استفاده مجدد از کد ها
  3. بهبود قابلیت نگه داری و تست

در نهایت باید بگم که معکوس سازی جریان تصمیم می گیرد که کنترل دست کی باشد که در اینجا همه کنترل درست کلاینت است و اوست که تصمیم می گیرد که کلاس کالج باید از چ نوع رویدادی پشتبانی کند

منبع

درباره ی محمد لطفی

برنامه نویس و توسعه دهنده .Net هستم. از یادگیری و آموزش لذت می برم. برنامه نویسی رو از دانشگاه شروع کردم و الانم در نیک آموز مهارت های خودم رو توسعه می دم.

همچنین ببینید

Difference Between ASP.NET MVC5 And ASP.NET Core

مقایسه Asp.Net MVC و Asp.Net Core

    درسال 2016 مایکروسافت از فریم ورک جدید خود یعنی .Net Core رونمایی کرد. …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *