ASP.NET Core بسیار به تزریق وابستگی وابسته است. بدون درک مبانی این فریمورک و پذیرفتن آن قادر به نوشتن برنامه هایی بهتر نخواهیم بود.
در این مقاله، همین موارد را خواهیم آموخت.
.NET Core فریمورک Dependency Injection DI را بصورت داخلی ارائه می دهد.
ASP.NET Core از آن استفاده میکند. ASP.NET Core، برای ما Controller ها و View ها را با DI Framework ثبت می کند. اما نیاز است سرویس های خود (کلاس ها) را با DI Framework ثبت کنیم.
تزریق وابستگی در ASP.NET Core
ثبت سرویس ها با DI Framework
نیاز است کلاس های Non-Controller خود را با DI Framework ثبت کنیم اگر:
- می خواهیم هر نوع وابستگی را به این کلاس ها تزریق کنیم یا
- می خواهیم کلاس های خود را به عنوان یک وابستگی به کلاس های دیگر تزریق کنیم.
برای مثال، رابط IEmailSender و کلاس EmailSender را داریم (یک پیاده سازی رابط).
می خواهیم از IEmailSender (به جای EmailSender) در کلاس های مصرف کننده ی خود استفاده کنیم.
بنابراین، به DI Framework خواهیم گفت که اگر یک کلاس، وابستگی IEmailSender را بخواهد، نمونه ای از EmailSender ایجاد کرده و آن را تزریق کند.
این کار را در Startup.ConfigureServices انجام می دهیم
services.AddScoped<IEmailSender, EmailSender>();
همچنین، باید کلاس های Consumer را ثبت کنیم.
DI Framework نمونه ای از کلاس های مصرف کننده ایجاد و وابستگی های ‘مورد نیاز’ را تزریق خواهد کرد.
برای مثال، یک کلاس مصرف کننده داریم (TestManager) که به برخی سرویس ها وابسته است، مانند: IEmailSender.
بنابراین TestManager را ثبت خواهیم کرد.
services.AddScoped<TestManager>();
نکته
می توانید بر حسب نیاز و منطق خود از AddTransient یا AddSingleton استفاده کنید.
تزریق سرویس ها در کلاس های Controller یا Non Controller
اکنون، هر کجا که بخواهیم از سرویسی استفاده کنیم، به سادگی متغیری از آن نوع در سازنده (یعنی تزریق Construction) ایجاد خواهیم کرد.
در مثال زیر، می خواهیم از Logger، Configuration، و EmailSender در یکی از کنترل کننده های خود استفاده کنیم.
public UserController(ILogger<UserController> logger, IConfiguration configuration, IEmailSender emailSender) { _logger = logger; _configuration = configuration; _emailSender = emailSender; }
نکته
تزریق IConfiguration جهت گرفتن پیکربندی ها، روش پیشنهاد شده ای نیست.
بکارگیری سرویس ها از طریق DI در متدهای Action
ممکن است تنها در Action های خاصی نیاز به سرویس معینی داشته باشیم.
اگر بخواهیم سرویسی را مستقیما درون متد action تزریق کنیم (به جای تزریق از طریق سازنده)، می توانیم از خاصیت [FromServices] استفاده کنیم.
public IActionResult About([FromServices] IEmailSender emailSender) { return View(); }
بکارگیری سرویس ها از طریق DI در Viewها
بطور ایده آل، باید داده ها را از کنترل کننده ها به نمایه ها ارسال کنیم، اما اگر نیاز به استفاده از سرویسی در Viewها پیدا کنیم، می توانیم آن را در Viewها تزریق کنیم.
این کار را با استفاده از همیار @inject انجام می دهیم.
در اینجا، شیء EmailSender را در فایل View تزریق می کنیم و سپس می توانیم از این شیء ‘emailSender’ در View جهت دسترسی به اعضای آن استفاده کنیم.
@inject IEmailSender emailSender
ایجاد نمونه ای از یک کلاس Consumer بصورت دستی در Controller
در مواقعی مشخص، ممکن است نیاز باشد تا نمونه ای از کلاس consumer (کلاسی که به سرویس های دیگر وابسته است) ایجاد کنیم.
در چنین مواقعی، باید از DI Framework جهت ایجاد نمونه ی کلاس مصرف کننده استفاده کنیم.
Controller، HttpContext را در اختیار ما قرار می دهد که حاوی ویژگی ‘RequestServices’ (از نوع IServicesProvider) می باشد.
در اینجا، نمونه ای از کلاس TestManager در Controller ایجاد می کنیم.
var t =(TestManager) this.HttpContext.RequestServices.GetService(typeof(TestManager));
با افزودن فضای نام Microsoft.Extensions.DependencyInjection، نسخه ای عمومی از GetService دریافت می کنیم.
var t = this.HttpContext.RequestServices.GetService<TestManager>();
ایجاد نمونه ای از یک کلاس Consumer بصورت دستی در هر کلاس
برای ایجاد نمونه ای از کلاس مصرف کننده، به IServicesProvider نیاز داریم.
کلاس Controller این امکان را بطور پیش فرض در اختیار ما قرار می دهد. اما می توانیم IServicesProvider را در کلاس های Controller یا Non-Controller نیز تزریق کنیم.
public UserController(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; }
سپس، می توانیم برای ایجاد نمونه از متد GetService استفاده کنیم.
var t2= (TestManager) _serviceProvider.GetService(typeof(TestManager));
با افزودن فضای نام Microsoft.Extensions.DependencyInjection، نسخه ای عمومی از GetService دریافت می کنیم.
var t4 = _serviceProvider.GetService<TestManager>(); var t3 = _serviceProvider.GetRequiredService<TestManager>();
هیچ دیدگاهی نوشته نشده است.