سلام، تو این پست میخوام به ساده ترین شکل ممکن فرق بین این سه نوع 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 ساخته میشه.
در نهایت کد های بالا اینجاست :)
امیدوارم این پست براتون مفید باشه، اگر تو بهبود مطلب هم نظری داشتین خوشحال میشم بدونم :)