تزریق وابستگی یا Dependency injection چیست؟
تزریق وابستگی (DI) الگویی است که می تواند به توسعه دهندگان کمک کند تا بخش های مختلف برنامه های خود را جدا کنند. هنگامی که یک سیستم برای استفاده از DI طراحی شده است، و بسیاری از کلاسها وابستگیهای خود را از طریق سازنده (یا ویژگیهایشان) درخواست میکنند، مفید است که کلاسی برای ایجاد این کلاسها با وابستگیهای مرتبط با آنها اختصاص داده شود. به این کلاس ها کانتینرها یا به طور خاص کانتینرهای وارونگی کنترل (IoC) یا ظروف تزریق وابستگی (DI) گفته می شود. کانتینر اساساً کارخانه ای است که مسئول ارائه نمونه هایی از انواع درخواستی از آن است.
تزریق وابستگی(Dependency injection) در .Net Core
Microsoft .NET Core شامل یک کانتینر داخلی ساده است (توسط اینترفیس IServiceProvider ارائه شده است) که از تزریق سازنده پشتیبانی می کند. فضای نام که تحت آن گنجانده شده است Microsoft.Extensions.DependencyInjection است.
انواع روش های پیاده سازی تزریق وابستگی یا Dependency injection
تزریق وابستگی به روش Constructor Injection
در Constructor Injection ، انژکتور (کلاس واگذار شده) نمونه های جدیدی از اشیاء وابسته را از طریق سازنده خود ایجاد می کند.
تزریق وابستگی به روش Property Injection
در Property Injection ، انژکتور (کلاس واگذار شده) اشیاء وابسته را از طریق یک پراپرتی(ویژگی) عمومی تزریق می کند.
تزریق وابستگی به روش Method Injection
در Method Injection ، انژکتور (کلاس واگذار شده) از روش خاصی برای تزریق اشیاء وابسته استفاده می کند.
طول عمر وابستگی
در زمان ثبت سرویس، وابستگی ها نیاز به تعریف طول عمر دارند. طول عمر سرویس، شرایطی را که تحت آن یک نمونه جدید از سرویس ایجاد می شود را مشخص می کند. در زیر طول عمر تعریف شده توسط چارچوب .NET Core DI آمده است.
تزریق وابستگی Transient یا گذرا
وابستگی های با طول عمر Transient ، با هر بار درخواست، نمونه جدیدی از آن توسط کانتینر ایجاد می شود.
اغلب اوقات، وابستگی هایی که Transient اعلام می شوند، بسیار سبک هستند و خود تعداد محدودی وابستگی دارند. علاوه بر این، فرض بر این است که وابستگی هایی که Transient مشخص شده اند، وضعیت خود را مدیریت نخواهند کرد.
وابستگی با طول عمر Transient به عنوان طول عمر سرویس «پیشفرض» در NET 6 در نظر گرفته میشود. این بدان معناست که شما باید همه وابستگیها را Transient کنید، مگر اینکه واقعاً نیاز به استفاده از یکی از طول عمر سرویسهای دیگر داشته باشید.
تزریق وابستگی Scoped یا محدوده شده
وابستگی های با طول عمر Scoped به ازاء هر درخواست برنامه ایجاد می شوند. "درخواست برنامه" در انواع مختلف برنامه ها متفاوت است. در برنامه های وب ASP.NET، "درخواست برنامه" یک درخواست وب HTTP است.
در حالت Scoped نمونه وابستگی در ابتدای درخواست ایجاد میشود و به تمام وابستگیهایی که در طول درخواست به آن نیاز دارند تزریق میشود و در انتهای درخواست توسط کانتینر dispose میشود.
یک مثال کاربردی استفاده از تزریق وابستگی Scoped، اطلاعات مربوط به خود درخواست HTTP است، مانند کوکی ها. این اطلاعات باید در طول مدت درخواست وجود داشته باشد و همچنین باید برای هر درخواست بعدی قابل استفاده باشد.
تزریق وابستگی Singleton یا یگانه
Singleton یک وابستگی است که یک بار توسط کانتینر هنگام راه اندازی برنامه ایجاد می شود و سپس به هر کلاس وابسته ای که به یک نمونه از آن نیاز دارد تزریق می شود. این نمونه تا زمانی که برنامه خاموش یا راه اندازی مجدد نشود وجود خواهد داشت (مایکروسافت به صراحت می گوید که ما نباید کدی را برای مدیریت طول عمر سرویس singleton پیاده سازی کنیم و باید به کانتینر اجازه دهیم آن را برای ما مدیریت کند).
در دنیای واقعی، یکی از نمونههای وابستگی Singleton ممکن است یک سرویس کش باشد که یک حافظه کش و دسترسیها را برای آن کش نگهداری میکند.
وابستگی های Singleton می توانند وضعیت داخلی خود را مدیریت کنند. از آنجایی که وابستگی فقط یک بار ایجاد می شود، وضعیت داخلی نمونه می تواند تغییر کند و حفظ شود. این همان چیزی است که آن ها را از وابستگی های Transient یا Scoped متمایز می کند.
ما در این آموزش یک پروژه Asp Core 6 ایجاد خواهیم کرد و طول حیات انواع تزریق وابستگی Singleton،Scoped و Transient را بصورت عملی بررسی خواهیم کرد.
دریافت سورس پروژه بررسی Service Lifetime تزریق وابستگی در Asp core
نتیجه گیری:
وابستگیها میتوانند یکی از سه طول عمر زیر را داشته باشند:
- سرویس های Transient هر بار که تزریق می شوند ایجاد می شوند. Transient طول عمر سرویس پیش فرض است.
- سرویس های Scoped یک بار در هر درخواست ایجاد می شود.
- سرویس های Singleton فقط یک بار ایجاد می شود، همان نمونه به هر کلاس وابسته تزریق می شود.
اینکه هر وابستگی چه طول عمری باید داشته باشد به چندین چیز بستگی دارد، از جمله وضعیت داخلی که هر وابستگی باید حفظ کند. بهطور پیشفرض، سرویس ها باید Transient باشند و تنها در صورتی از طول عمر سرویسهای scoped یا singleton استفاده کنند که مورد استفاده آنها چنین طول عمری را ایجاب کند.
برای ثبت نظر باید در سایت ثبت نام یا ورود نمایید