close
دانلود آهنگ جدید
انواع تزریق وابستگی در ASP.NET Core

یک توسعه دهنده .Net

انواع تزریق وابستگی در ASP.NET Core

Dependency injection,.net core,

در core ما 3 نوع تزریق وابستگی TransientScopedSingletonTransient (به معنی گذرا, زود گذر, فانی ): همانطور که از اسمش پیداست  lifetime (طول عمر)  این سرویس ها به این صورت که، هر زمانی که درخواست شده ایجاد میشوند( هر دفعه ایجاد میشوند یا هر جا درخواست شده باشند همان جا ایجاد میشوند). و برای سرویس ها  lightweight, stateless  (بی وضعیت و سبک) مناسب است.Scoped (دامنه): طول عمر این سرویس ها، یکبار در هر درخواست ایجاد شده است.مراقب باشید: وقتی از Scoped …

انواع تزریق وابستگی در ASP.NET Core

166

در core ما 3 نوع تزریق وابستگی 


  1. Transient
  2. Scoped
  3. Singleton

Transient (به معنی گذرا, زود گذر, فانی ): همانطور که از اسمش پیداست  lifetime (طول عمر)  این سرویس ها به این صورت که، هر زمانی که درخواست شده ایجاد میشوند( هر دفعه ایجاد میشوند یا هر جا درخواست شده باشند همان جا ایجاد میشوند). و برای سرویس ها  lightweight, stateless  (بی وضعیت و سبک) مناسب است.


Scoped (دامنه): طول عمر این سرویس ها، یکبار در هر درخواست ایجاد شده است.

مراقب باشید: وقتی از Scoped  در middleware استفاده میکنید ، سرویس را به متد Invoke یا InvokeAsync تزریق کنید.و از طریق constructor injection  ( تزریق در سازنده) این کار را انجام ندهید چون سرویس را مجبور به رفتاری مانند Singleton  میکند.


Singleton (یگانه ، تک ورق): طول عمر سرویس های سینگلتون زمان اولین درخواست ایجاد میشوند(یا هنگامی که ConfigureServices اجرا می شود و یک نمونه با ثبت سرویس مشخص می شود - یعنی وقتی ConfigureServices اجرا میشود یک نمونه از سرویسی که با نوع Singleton  ثبت کردیم ایجاد میشود).درخواست های بعدی از همان نمونه استفاده می کند.اگر برنامه نیاز به رفتار singleton  داشته باشد ، توصیه میشود اجازه دهید service container مدیریت طول عمر سرویس ها را بر عهده بگیرید.الگوی طراحی singleton را اجرا نکنید و کد کاربر را برای مدیریت طول عمر شیء در کلاس اعمال کنید.

مراقب باشید: خطرناک است برای حل و فصل یک سرویس scoped از یک singleton استفاده کنید.ممکن است باعث شود سرویس مورد نظر در وضعیت غلط (incorrect stateهنگام پردازش درخواست های بعدی قرار گیرد.



با توجه به موارد بالا برای انتخاب درست نوع سرویس یک مثال مطرح میکنم:


مثلا فرض کنید ما یک repository با ef core  ساختیم هنگامی که می خواهید ریپوزیتوری به عنوان سرویس ثبت کنید به این نکته توجه کنید که این ریپوزیتوری خودش از context برنامه ارث بری کرده که خود context از dbcontext ارث بری کرده و این به این معناست که طول عمر سرویس ما یا باید برابر با طول عمر dbcontext یا کوتاه تر از آن باشد (بخاطر صدا زدن sitecontext.add(x)) . با توجه به طور عمر dbcontext  ما نمیتوانیم repository مان را از نوع singleton  ثبت کنم چون طول عمر singleton  بیشتر از طول عمر  dbcontext  هست (به مراقب باشید singleton مراجعه کنید) از طرفی نمی توانیم از نوع Transient هم ثبت کنیم چون در هر درخواست یک نمونه جدید ساخته میشود و این بدین معنی است که تمام وضعیت (حالت) نگهداشته شده repository  از دست میدهیم اگر قسمت های متعددی از کد ما درخواست شده باشد. بهترین گزینه برای ثبت سرویس scoped  میباشد.


شاید سوال پیش بیاد که dbcontext چرا اتوماتیک  scoped ثبت شده شاید دلیل اصلیشون این باشه که تیم ef میخواستن مطمئن شدن که بعد از هر درخواست dbcontext دیسپوز despose شود

بخشی از مطلب از ایجا گرفته شده