فریم ورک های تزریق وابستگی (Dependency Injection) درNET.

یکشنبه 8 بهمن 1396

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

فریم ورک های تزریق وابستگی (Dependency Injection) درNET.

تزریق وابستگی (DI) وابستگی بین کلاس ها را کاهش داده و پیاده‌سازی‌های پیوسته و انتزاعی (abstraction) را به بیرون از کلاس وابسته منتقل می‌کند و توسعه دهندگان را قادر می سازد تا تغییرات  و پیچیدگی های کدهای نرم افزار که در آینده به وجود می آیند را بهتر مدیریت کنند، بنابراین در نگهداری برنامه به ما کمک می کند. همچنین می تواند با تزریق سازنده (constructor injection)، تزریق تنظیم کننده (setter injection) و تکنیک های تزریق مبنی بر Interface (interface-based injection) انجام شود.

الگوی طراحی تزریق وابستگی (DI)

IOC (Inversion of Control) و تزریق وابستگی برای حذف وابستگی برنامه ایجاد می شوند. این امر باعث می شود که اجزای سیستم بیشتر از هم جدا و قابل نگهداری باشند. تزریق وابستگی یک الگوی طراحی است که نحوه ایجاد کلاس های متصل به هم را بدون محدودیت نشان می دهد. این الگو از سازنده شیء استفاده می کند تا اشیاء را راه اندازی اولیه (initialize) کرده و وابستگی های مورد نیاز شیء را فراهم کند، به این معنا که به توسعه دهندگان اجازه می دهد تا وابستگی را از خارج کلاس تزریق کنند. چهار راه برای دستیابی به تزریق وابستگی وجود دارد. شکل 1 آن ها را توضیح می دهد.

شکل 1: انواع تزریق وابستگی

IOC یک اصطلاح جنریک است. به جای اینکه برنامه متدها را در فریم ورک فراخوانی کند، فریم ورک پیاده سازی های برنامه را فراخوانی می کند. تزریق وابستگی شکلی از IOC است، که پیاده سازی ها از طریق سازنده ها/تنظیم کننده ها/ سرویس های lookup به شیء پاس داده می شوند که روی شیء تزریق خواهد شد و به درستی رفتار خواهد کرد. فریم ورک های تزریق وابستگی برای استفاده از DI طراحی شده اند و می توانند رابط ها (interface) را تعریف کرده تا پیاده سازی ها را آسان کنند.

لیست فریم ورک های تزریق وابستگی

در زیر لیستی از نگهدارنده های (container) محبوب تزریق وابستگی را شرح می دهیم.

Spring.NET

Spring.NET یکی از فریم ورک های open source محبوب برای تزریق وابستگی است که NET 4.0NET Client Profile 3.5. و 4.0، Silverlight 4.0 و 5.0 و Windows Phone 7.0 و 7.1 را پشتیبانی می کند.

Castle Windsor

Castle Windsor یک کانتینر کامل IOC برای .NET و Silverlight است. ورژن فعلی آن 4.0 است که در جولای 2017 منتشر شد. Castle Windsor را می توان از GitHub یا NuGet دانلود کرد. مزایای استفاده از Castle Windsor این است که کامل بوده و با decorator آشناست و به خوبی مستندشده است.

Unity

Unity (Unity Application Block) یک کانتینر تزریق وابستگی کم وزن و توسعه پذیر است که نسبتا پیچیده تر می باشد. Unity  از کانتینر و داده های XML استفاده می کند و پشتیبانی قدرتمندی از XML داشته و با برنامه های WPF  کار می کند. تحت مجوز عمومی مایکروسافت بوده و رایگان است. Unity به صورت‌مسأله هایی که توسعه دهندگان در مهندسی نرم افزار مبتنی بر مولفه با آن درگیرند می پردازد. همچنین شامل افزونه Interception container است که به توسعه دهنگان اجازه می دهد تا مدیریت exception، logging یا حتی کدهای سفارشی خود بین فراخواننده و فراخوانده شده را تزریق کنند.

Structure Map

Structure Map تزریق وابستگی برای .NET است که می تواند برای بهبود کیفیت معماری سیستم شیءگرا با کاهش هزینه های ماشینی تکنولوژی های طراحی خوب مورد استفاده قرار گیرد. تحت مجوز Apache 2 OSS منتشر شده است، رایگان می‌باشد و توسعه‌دهنده می‌تواند آن را دانلود کرده، تغییر دهد و مجددا توزیع کند.

Autofac

Autofac کانتینر IOC برای #Microsoft .NET C، ورژن‌های 3.0 و بالاتر می‌باشد. مجوز آن تحت MIT است. وابستگی‌های میان کلاس‌ها را مدیریت می‌کند، چنان که برنامه‌ها با تغییر در اندازه و پیچیدگی، همچنان آسان باقی بمانند.

Ninject

یک فریم‌ورک تزریق وابستگی همگانی، فوق‌العاده سبک و open source برای .NET، Mono، .NET Compact Framework و Silverlight می‌باشد. مجوز آن تحت Apache 2 است. Ninject به شما کمک می‌کند تا از تکنیک‌های تزریق وابستگی برای شکستن برنامه‌یتان به اجزای کاملا یکپارچه و پیوسته بدون محدودیت استفاده کنید، و سپس آن‌ها را به صورت انعطاف‌پذیر به هم متصل می‌کند.

مزایای تزریق وابستگی

تزریق وابستگی به جداسازی کلاس‌ها کمک می‌کند. DI و IOC کار را برای توسعه‌دهنده آسان می‌کنند تا بتواند وابستگی بین اشیاء را مدیریت کند. این امر باعث می‌شود تا توسعه‌دهنده راحت‌تر بتواند ارتباطات اساسی را با قراردادهای خود نشان دهد. در نتیجه کدها ماژولارتر می‌شوند. همچنین قابلیت استفاده مجدد کدها افزایش یافته و نگهداری و تست کدها بهبود می‌یابد.

معایب تزریق وابستگی

درک کد شما می‌تواند سخت‌تر شود. تزریق وابستگی معمولا با افزایش تعداد کلاس‌ها، که همیشه هم مفید نیستند، پیچیدگی کد را بالا می‌برد. به طور کلی مزیت جداسازی، خواندن و درک هر کار را ساده‌تر می‌کند، اما پیچیدگی هماهنگی بین کارهای پیچیده‌تر را افزایش می‌دهد.

تزریق وابستگی منحنی یادگیری بالاتری را دارد. برای درک نحوه استفاده یک پروژه از تزریق وابستگی، توسعه‌دهنده باید هم الگوی تزریق وابستگی و هم فریم‌ورک‌های خاص را درک کند.

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

نتیجه‌گیری

محبوبیت تزریق وابستگی در جامعه توسعه‌دهندگان همچنان رو به رشد است. IOC در مورد اینکه چه کسی شروع به برقراری تماس می‌کند، صحبت می‌کند، در حالی که DI در مورد نحوه دستیابی وابستگی یک شیء روی اشیای دیگر، از طریق انتزاع (abstraction)، صحبت می‌کند. اگر از تزریق وابستگی استفاده می‌کنید، سبک‌های زیادی برای انتخاب بین آن‌ها وجود دارد،. پیشنهاد ما این است که از تزریق سازنده (constructor injection) استفاده کنید.

آموزش سی شارپ

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

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

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

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