تزریق وابستگی (Dependency Injection) در#C

چهارشنبه 20 آبان 1394

Dependency Injection یا به اختصار DI روشی برای برقراری ارتباط بین کلاس ها است .در این مقاله روش های مختلف تزریق وابستگی شرح داده خواهد شد.

تزریق وابستگی (Dependency Injection) در#C

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

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

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

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

چهار : رابطه Composition: در اینجا هم رابطه جز به کلی وجود دارد ولی فرق آن با حالت قبل در این است که با مرگ کلاس کل اجزا از بین می روند و قابلیت استفاده مجدد ندارند.
پنج:رابطه Inheritance: در اینجا بین دو کلاس رابطه والد و فرزند برقرار است .کلاس فرزند علاوه بر ویژگی های تمام ویژگی های والد را نیز به ارث می برد.

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

یکی از روشهای مرسوم تزریق وابستگی کلاس سازنده است .این روش یک مشکل دارد و آن این است که تا وابستگی را پاس ندهیم امکان ساخت خود کلاس وجود ندارد.مشکل دیگر این روش این است که به ازای هر ایجاد نمونه از کلاس اول باید نمونه ای از کلاس سرویس دهنده را نیز انتقال دهیم .می توان وابستگی را از طریق ویژگی های کلاس به آن تزریق کرد که بهتر از روش قبل است .روش دیگری هم برای تزریق وابستگی وجود دارد و آنهم استفاده از Interface Injection است .در این حالت یک اینترفیسی که ساختار کلاس اصلی را پیاده سازی کرده باشد در کلاس وابسته پیاده سازی می شود.ولی باز هم این روش مشکل دارد زیرا از کلاسی که به آن وابسته هستیم باز هم به صورت مستقیم داریم استفاده می کنیم .و ما می خواستیم این رابطه مستقیم را حذف کنیم .

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

    namespace ConstructorInjection  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {}  
        }  
        class A  
        {  
            B b;  
            public A()  
            {  
                b = new B(); // A depends on B  
            }  
        }  
        class B  
        {}  
    }  

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

namespace ConstructorInjection  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            A objA = new A(new B());  
        }  
    }  
    class A  
    {  
        B b;  
        public A(B objB) // A now takes its dependencies as arguments  
            {  
                this.b = objB;  
            }  
    }  
    class B  
    {}  
} 

آموزش سی شارپ

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

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

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

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