شرح مفهوم تزریق وابستگی (Dependency Injection)

چهارشنبه 9 اردیبهشت 1394

در این مقاله مبانی تزریق وابستگی را فراخواهیم گرفت

شرح مفهوم تزریق وابستگی (Dependency Injection)

در این مقاله مبانی تزریق وابستگی را فراخواهیم گرفت.

تزریق وابستگی چیست؟(What is Dependency injection)

تزریق وابستگی یک نرم افزار ااگوی طراحی است که کنترل را پیاده سازی معکوس می کند.

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

برای درک این شما باید اتصال مستحکم (tight coupling) را درک کنید.
برای درک این دو مفهوم ،آنها را با یک مثال توضیح می دهیم.
در نظر بگیرید که وب سایت برنامه نویسان با mvc پیاده سازی شده است در جایی که کاربر یک مقاله را ارسال می کند و آنها از طریق ایمیل  اطلاع پیدا میکنند  که مقاله با موفقیت ارسال شده است.
فرستادن ایمیل:
فرض بر این است که از Google SMTP برای فرستادن ایمیل استفاده کردیم:

    public class User   
    {  
        GoogleSMTPEmailSend googleSender;  
        public User()   
        {  
            googleSender = new GoogleSMTPEmailSend();  
        }  
        public void PostArticle()   
        {  
            //mail for successfull post  
            googleSender.SendEmail();  
        }  
    }  
    class GoogleSMTPEmailSend   
    {  
        public void SendEmail()   
        {  
            //send email for successful post  
        }  
    }  

در کد بالا شما tight coupling را مشاهده میکنید درنظربگیرید که در آینده بخواهیم از SMTP دیگر مثل یاهو برای ارسال ایمیل استفاده کنیم .در اینجا نیاز داریم کد را تغییر دهیم و به همین دلیل این tight coupling است.

حال برای حذف tight coupling چیکار کنیم؟

در اینجا واژه وابستگی ارتباط است شما می تواند ببینید کاربر وابسته به ارسال پست الکترونیکی است. این نباید پیاده سازی یک کلاس بهم چسبیده داشته باشد بنابراین کنترل باید معکوس باشد.
چگونه این را حذف کنیم؟ما میتوانیم کنترل را با استفاده از یک واسط معکوس کنیم؟
حال کد بعد از استفاده از  واسط خواهید دید حال سوال این است که وابستگی به صورت کامل حذف شده است؟

    public interface IEmailSender   
    {  
        void SendEmail();  
    }  
    class GoogleSMTPEmailSend: IEmailSender   
    {  
        public void SendEmail()  
        {  
            //send email for successful post  
        }  
    }  
    public class User  
    {  
        public IEmailSender emailSender;  
        public User()  
        {  
            emailSender = new GoogleSMTPEmailSend();  
        }  
        public void PostArticle()   
        {  
            //mail for successfull post  
            emailSender.SendEmail();  
        }  
    }  

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

emailSender = new GoogleSMTPEmailSend();

ما مشکلات بیشتری داریم:

User: PostArticle() IEmailSender GoogleSMTPEmailSend();  

PostArticle روی هردو IEmailSender و GoogleMSTPEmailSend وابسته است.

 
چگونه میتوانیم این کار را بدون ساختن یک شی از  GoogleSMTPEmailSend انجام دهیم.
 
ما یک شی میسازیم ولی نه در اینجا چون وابستگی ایجاد میکند .
چگونه میتوان وابستگی را کاملا حذف کرد؟
حذف وابستگی  در دو بخش انجام میشود:
بخش اول: حذف وابستگی روی یک کلاس بهم چسبیده  که راه حل آن فرستادن یک متغیر از رابط در Constructor  از کلاس user شبیه کد زیر:
 

    public class User   
    {  
        public IEmailSender emailSender;  
        public User(IEmailSender _emailSender)   
        {  
            emailSender = _emailSender;  
        }  
        public void PostArticle()  
        {  
            //mail for successfull post  
            emailSender.SendEmail();  
        }  
    }  
این کار میتواند به سه روش انجام شود:
1-تنظیم خصوصیت
2-تابع
3-سازنده(Constructor)
همانطور که دیدید از روش سوم استفاده کردیم.
شما ممکن است فکر کنید که  کلاس _emailsend کجا پیاده سازی یا ساخته شده است
بخش دوم :
پاسخ:در زمان اجرا.در زمان اجرا ،درخواست کلاس user که فرستاده شده است توسط رابط  IEmailSender پیاده سازی میشود.
یک نمونه از کلاس هایی که پیاده سازی میشوند واسط  IEmailSender  ایجاد خواهد شد و در زمان اجرا به کلاس کاربر فرستاده میشود.
چگونه این کار انجام دهیم؟کلاس متصل بدون ساخت یک وابستگی در کجا ایجاد میشود؟
پاسخ :DI container حال سوال این است که DI container چیست؟
DI container یک کامپوننت است که به عنوان یک واسطه بین وابستگی عمل میکند که یک کلاس مثل کاربر درخواست می کند و اجرای اتصال بین آن وابستگی ها مثل GoogleSMTPEmailSend  که باید هر زمان که نیاز است ایجاد شود.
چگونه یک DI Container بسازیم؟
DI Container های زیادی وجود دارد مثل Ninject و Unit نیاز به ساخت یک DI container وجود ندارد چون مایکروسافت  قبلا یک DI container به نام Unity ساخته است.
من به شما توصیه می کنم به خواندن مقاله زیر که نشان می دهد  تزریق وابستگی با استفاده از Unit در MVC :
 
 
 
 
 
 
 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 11k بازدید
  • 3 تشکر

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید