با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با یکی دیگر از جلسات دوره کامل آموزش asp.net core در خدمت شما دوستان هستیم . در بخش قبل به معرفی قابلیت تزریق وابستگی ها پرداختیم و گفتیم که NET Core. این ویژگی نیز پشتیبانی می کند در این جلسه به آموزش تزریق وابستگی ها در ASP.NET Core ( Dependency injection ) بخش دوم می پردازیم تا پایان این جلسه با ما همراه باشید
در ظرف ساخته شده IoC می توان طول عمر سرویس ثبت شده را مدیریت کرد. Ioc Container به طور خودکار طول عمر یک سرویس را بر اساس مدت زمان خاص مشخص می کند.
ظرف IoC سه نوع طول عمر را برای سرویس ها پشتیبانی می کند :
کدهای زیر نشان می دهد که چگونه سرویس ها را با طول عمر مختلف ثبت کنید :
1 2 3 4 5 6 7 8 | public void ConfigureServices(IServiceCollection services) { services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger())); // singleton services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Transient)); // Transient services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Scoped)); // Scoped } |
چارچوب ASP.NET Core شامل متدهای توسعه یافته (extension methods) برای هر طول نیز می باشد. میتوان از متد های AddSingleton و AddTransient و AddScoped برای طول عمرهای تک تک، گذرا و محدود استفاده کرد.
در مثال زیر این روش بیان شده است :
1 2 3 4 5 6 7 8 9 10 11 | public void ConfigureServices(IServiceCollection services) { services.AddSingleton<ILog, MyConsoleLogger>(); services.AddSingleton(typeof(ILog), typeof(MyConsoleLogger)); services.AddTransient<ILog, MyConsoleLogger>(); services.AddTransient(typeof(ILog), typeof(MyConsoleLogger)); services.AddScoped<ILog, MyConsoleLogger>(); services.AddScoped(typeof(ILog), typeof(MyConsoleLogger)); } |
برای مثال می توانیم از ILog در هر کنترلر MVC استفاده کنیم . کدهای زیر گویای مطلب هستند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class HomeController : Controller { ILog _log; public HomeController(ILog log) { _log = log; } public IActionResult Index() { _log.info("Executing /home/index"); return View(); } } |
در مثال بالا، یک ظرف IoC به طور خودکار نمونه ای از MyConsoleLogger را به سازنده HomeController منتقل می کند و ما نیازی به انجام کاری دیگر نداریم.
همچنین ظرف IoC یک نمونه از ILog را هم بر اساس طول عمر ثبت شده ایجاد و دفع (dispose) می کند.
گاهی اوقات ممکن است لازم باشد از یک سرویس در یک action به عنوان پارامتر استفاده گردد. برای این کار ، ویژگی [FromServices] را بهمراه پارامتر مورد نظر به اکشن ارسال میکنیم مانند کد های زیر :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using Microsoft.AspNetCore.Mvc; public class HomeController : Controller { public HomeController() { } public IActionResult Index([FromServices] ILog log) { log.info("Index method executing"); return View(); } } |
ظرف IoC پیش فرض در NET Core. تزریق Property ها را پشتیبانی نمی کند. شما باید از ظرف IoC سفارشی بدین منظور استفاده کنید.
لازم نیست حتما سرویس وابستگی را در به سازنده معرفی کنید. می توانید به سرویس های ظرف IoC در حالت دستی با استفاده از Property RequestServices از HttpContext دسترسی داشته باشیم، همانطور که در زیر نشان داده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class HomeController : Controller { public HomeController() { } public IActionResult Index() { var services = this.HttpContext.RequestServices; var log = (ILog)services.GetService(typeof(ILog)); log.info("Index method executing"); return View(); } } |
البته روش معرفی به سازنده کلاس نسبت به روش دستی برای تزریق وابستگی ها بیشتر توصیه شده است .
در بخش بعدی آموزش در رابطه با میان افزار (middleware ) صحبت خواهیم کرد.
sanaz bemani
با سلام . ممنون از مطلب خوبتون . من یک مطلب خواندم راجع به استفاده از چند تزریق وابستگی در asp.net core که واقعا خوب بود . خواستم به شما دوستان هم معرفی کنم :