تزریق وابستگی در .NET Core و بررسی طول عمر سرویس ‏ها

Loading...
تزریق وابستگی در .NET Core

هدف این مقاله این است که درک سریعی از طول عمر سرویس ‏ها برای تزریق وابستگی در .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

   در برنامه ‏ی نمونه، ما ۳ اسکوپ داریم:

  •  برای تابع اصلی
  • برای درخواست ۳ و ۴
  •  برای درخواست ۵

در خروجی بالا، می‏توان دید که یک سرویس دامنه‏ دار تنها هنگامی که برای اولین بار در یک اسکوپ خاص فراخوانی می‏شود، ایجاد شده است. بطور خلاصه، مانند یک سرویس سینگلتون در یک اسکوپ معین کار می‏کند.



مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۳۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره--
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۶۵,۵۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...