امید پاکدل
امید پاکدل
خواندن ۲ دقیقه·۳ سال پیش

تفاوت Transient, Scoped و Singleton در تزریق وابستگی ( Dependency Injection ) دات نت کور

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

وقتی که یک سرویس رو داریم register میکنیم، باید نوع lifetime رو مشخص کنیم :

Singleton

این سرویس ها کلا یک بار و همون ابتدا ساخته میشن و برای کلِ سیستم از همون instance استفاده میشه. چون یکبار ساخته میشن و از همون instance در همه جای اپلیکیشن استفاده میشه، مصرف منابع مناسبی دارند.

Transient

سرویسی که با این نوع ریجستر بشه، هر بار که اون سرویس درخواست بشه، یه instance ازشون ساخته میشه. چون با هر ریکوئست مجدد ساخته میشن مموری و منابع بیشتری مصرف میکنن و میتونن روی پرفورمنس تاثیر بذارن.

Scoped

با هر درخواست سمت وب سرویس، یه instance ازشون ساخته میشه، یعنی اگر یه سرویسی رو چند جا بخوایم استفاده کنیم از همون instance ای که همون ابتدای درخواست ساخته شده استفاده میشه. مختصرا یعنی همون singleton اما داخل یک ریکوئست بجای کل اپلیکیشن.

حالا برای مفهوم بهتر یک مثال رو از خودِ مایکروسافت میریم جلو تا بیشتر جا بیفته. یک کنسول اپلیکیشن با دات نت کور ۳ به بعد میسازیم.

یک اینترفیس میسازیم که فقط یک id داشته باشه.

حالا به ترتیب برای اون نوع lifetime هایی که گفتیم اینترفیس میسازیم.

یک کلاس میسازیم تا عملیات تولید Guid رو انجام بده.

با ساختن این کلاس تمام اینترفیس هایی که ساختیم هم مقادیرشون پر میشه.
با ساختن این کلاس تمام اینترفیس هایی که ساختیم هم مقادیرشون پر میشه.

حالا یک سرویس مینویسیم که تمام اینترفیس هامون رو نیاز داشته باشه.

اگه تو پروژتون این موارد پایین وجود نداشت حتما اون هارو اضافه کنید:

Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting

حالا نوبت ریجستر کردن سرویسمونِ که ببینیم چطوری کار میکنه، کلاس Program.cs رو به این شکل تغییرش میدیم.

تو اینجا اومدیم میگیم بیا سرویس رو Call کن، با دوتا Scope متفاوت ( ابتدای اون متود ExemplifyScoping یه Scope جدید میسازیم.) و دوتا ریکوست متفاوت که قشنگ مشخص باشه چه اتفاقی میفته.

خب همینطوری که میبینید تو عکس Id هایی که تولید شدن برای Singleton همیشه یکی هستند. ما دوتا Scope ساختیم اما همونطوری که قبلا گفتم برای کل اپلیکیشن یکی هستند. سرویسی که با Transient ریجستر شده بود همیشه متفاوت هست، چون با هر ریکوئست ساخته میشه. و سرویسی که با Scoped ریجستر شده بود فقط با تغییر Scope ساخته میشه.

در نهایت کد های بالا اینجاست :)

امیدوارم این پست براتون مفید باشه، اگر تو بهبود مطلب هم نظری داشتین خوشحال میشم بدونم :)


برنامه نویسیدات نت کورnet core
توسعه دهنده نرم افزار
شاید از این پست‌ها خوشتان بیاید