تفاوت Transient, Scoped و Singleton در DI دات نت کور

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

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

Singleton

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

Transient

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

Scoped

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

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

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

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

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

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

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

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

Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting

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

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

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

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

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

نوشته تفاوت Transient, Scoped و Singleton در DI دات نت کور اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

دیدگاهتان را بنویسید