هدف این مقاله این است که درک سریعی از طول عمر سرویس ها برای تزریق وابستگی در .NET Core ارائه دهد. این مقاله این مسأله که DI (تزریق وابستگی) چیست یا چگونه در .NET Core کار میکند را پوشش نمیدهد.در ادامه این موضوع را بررسی خواهیم کرد همراه ما باشید.
توضیح مختصر تزریق وابستگی در .NET Core
تزریق وابستگی (DI) الگویی است که میتواند به توسعه دهندگان کمک کند تا بخش های مختلف برنامه هایشان را جدا کنند. زمانی که یک سیستم طراحی میشود تا از DI استفاده کند، با کلاس های بسیاری که وابستگی خود را از طریق سازندهی خود (یا خاصیت ها) درخواست میکنند، داشتن یک کلاس اختصاصاً برای ایجاد این کلاسها با وابستگی های مربوطه شان مفید است. این کلاسها به عنوان نگهدارنده شناخته میشوند، یا بطور اختصاصی، نگهدارنده های وارونگی کنترل (IoC) یا یا نگهدارنده های تزریق وابستگی (DI). نگهدارنده اساساً یک کارخانه است که مسئول ارائه ی نمونه هایی از انواع که از آن درخواست میشود است.
فریمورک Microsoft .NET Core
Microsoft .NET Core یک نگهدارنده ی داخلی ساده (نشان داده شده توسط اینترفیس IServiceProvider) که از تزریق سازنده پشتیبانی میکند را شامل میشود. فضای نامی که آن را در زیر گروه خود شامل میشود Microsoft.Extensions.DependencyInjection است.
طول عمر تزریق وابستگی در .NET Core
در زمان ثبت، وابستگی ها نیازمند یک تعریف طول عمر هستند. طول عمر سرویس شرایطی که تحت آن یک نمونه سرویس جدید ایجاد میشود را تعیین میکند. در زیر طول عمرهایی که توسط فریمورک .NET Core DI مشخص شده اند را میتوانید مشاهده کنید.
- Transient (گذرا)
- هر زمان که درخواست شوند ایجاد میشود.
- Scoped (دامنه دار)
- در هر دامنه، یعنی درخواست وب یا هر واحد کار، یک بار ایجاد میشود.
- Singleton (تک عضو)
- تنها برای اولین درخواست ایجاد شده است. اگر یک نمونه ی خاص در زمان ثبت مشخص شود، این نمونه در اختیار تمامی مصرف کنندگان نوع ثبت قرار خواهد گرفت.
بیایید طول عمرها را با استفاده از یک قطعه کد ساده برای برنامه ی کنسول زیر درک کنیم.
public interface IService { void Info(); } public interface ISingleton : IService { } public interface IScoped : IService { } public interface ITransient : IService { } public abstract class Operation : ISingleton, IScoped, ITransient { private Guid _operationId; private string _lifeTime; public Operation(string lifeTime) { _operationId = Guid.NewGuid(); _lifeTime = lifeTime; Console.WriteLine($"{_lifeTime} Service Created."); } public void Info() { Console.WriteLine($"{_lifeTime}: {_operationId}"); } } public class SingletonOperation : Operation { public SingletonOperation() : base("Singleton") { } } public class ScopedOperation : Operation { public ScopedOperation() : base("Scoped") { } } public class TransientOperation : Operation { public TransientOperation() : base("Transient") { } } class Program { static void Main(string[] args) { var serviceProvider = new ServiceCollection() .AddTransient<ITransient, TransientOperation>() .AddScoped<IScoped, ScopedOperation>() .AddSingleton<ISingleton, SingletonOperation>() .BuildServiceProvider(); Console.WriteLine("========== Request 1 ============"); serviceProvider.GetService<ITransient>().Info(); serviceProvider.GetService<IScoped>().Info(); serviceProvider.GetService<ISingleton>().Info(); Console.WriteLine("========== ========= ============"); Console.WriteLine("========== Request 2 ============"); serviceProvider.GetService<ITransient>().Info(); serviceProvider.GetService<IScoped>().Info(); serviceProvider.GetService<ISingleton>().Info(); Console.WriteLine("========== ========= ============"); using (var scope = serviceProvider.CreateScope()) { Console.WriteLine("========== Request 3 ============"); scope.ServiceProvider.GetService<IScoped>().Info(); scope.ServiceProvider.GetService<ITransient>().Info(); scope.ServiceProvider.GetService<ISingleton>().Info(); Console.WriteLine("========== ========= ============"); Console.WriteLine("========== Request 4 ============"); scope.ServiceProvider.GetService<IScoped>().Info(); scope.ServiceProvider.GetService<ISingleton>().Info(); Console.WriteLine("========== ========= ============"); } using (var scope = serviceProvider.CreateScope()) { Console.WriteLine("========== Request 5 ============"); scope.ServiceProvider.GetService<IScoped>().Info(); scope.ServiceProvider.GetService<ISingleton>().Info(); Console.WriteLine("========== ========= ============"); } Console.WriteLine("========== Request 6 ============"); serviceProvider.GetService<IScoped>().Info(); Console.WriteLine("========== ========= ============"); Console.ReadKey(); } }
نمونه خروجی
========== Request 1 ============ Transient Service Created. Transient: 6958dca3-05a7-4322-82b6-dec6fcacefeb Scoped Service Created. Scoped: c1098528-5855-46f7-a284-ba2a1dff0769 Singleton Service Created. Singleton: 5ca7706b-5181-49ff-be09-5493f0decc0d ========== ========= ============ ========== Request 2 ============ Transient Service Created. Transient: c7710765-0b09-43bd-86f4-0ef022ed5220 Scoped: c1098528-5855-46f7-a284-ba2a1dff0769 Singleton: 5ca7706b-5181-49ff-be09-5493f0decc0d ========== ========= ============ ========== Request 3 ============ Scoped Service Created. Scoped: 6d5d7842-468f-4040-907c-6b2ab907df61 Transient Service Created. Transient: 1ec15435-dda2-4fe0-8e29-c154c0352c95 Singleton: 5ca7706b-5181-49ff-be09-5493f0decc0d ========== ========= ============ ========== Request 4 ============ Scoped: 6d5d7842-468f-4040-907c-6b2ab907df61 Singleton: 5ca7706b-5181-49ff-be09-5493f0decc0d ========== ========= ============ ========== Request 5 ============ <strong>Scoped Service Created. </strong>Scoped: 2ad1a715-09b0-4aac-9b84-2df376cc2223 Singleton: 5ca7706b-5181-49ff-be09-5493f0decc0d ========== ========= ============ ========== Request 6 ============ Scoped: c1098528-5855-46f7-a284-ba2a1dff0769 ========== ========= ============
تحلیل خروجی
- (Transient – (Request 1,2,3
- در خروجی بالا، میتوانیم ببینیم که یک سرویس ترنزینت نمونه ی جدید هر بار که سرویس درخواست شده ایجاد شده است.
- (Singleton – (Request 1,2,3,4,5
- در خروجی بالا، میتوانیم مشاهده کنیم که یک سرویس سینگلتون تنها هنگامی که برای اولین بار فراخوانده میشود ایجاد میشود. در درخواست های بعدی، همان نمونه ارائه شده است.
- (Scope – (Request 1,2,3,4,5,6
در برنامه ی نمونه، ما ۳ اسکوپ داریم:
- برای تابع اصلی
- برای درخواست ۳ و ۴
- برای درخواست ۵
در خروجی بالا، میتوان دید که یک سرویس دامنه دار تنها هنگامی که برای اولین بار در یک اسکوپ خاص فراخوانی میشود، ایجاد شده است. بطور خلاصه، مانند یک سرویس سینگلتون در یک اسکوپ معین کار میکند.
هیچ دیدگاهی نوشته نشده است.