مقدمه:
همانطور که احتمالا مستحضر می باشید، در ASP.NET Core بر خلاف نسخه های قبلی
ASP.NET به طور پیشفرض مکانیزمی جهت تزریق وابستگی ها (Dependency Injection) تعبیه
شده است و دیگر نیازی به استفاده از کتابخانه های دیگر از قبیل Ninject و Autofac و
... نمی باشد. البته هنوز بسیار زود است که در این مورد اظهار نظر کرد و باید منتظر
ماند و دید که این کتابخانه های مشهور و قدرتمند چه امکانات بیشتری و بهتری نسبت به
امکانات تعبیه شده در ASP.NET Core به ارمغان خواهند آورد.
شروع:
قبل از اینکه به موضوع اصلی این مقاله بپردازیم، بد نیست به شکل خیلی خلاصه به
چند نکته در رابطه با استفاده از مکانیزم تزریق وابستگی در ASP.NET Core بپردازیم.
قطعه کد زیر رو در نظر بگیرید:
public interface IService1
{
string GetName();
}
public class Service1 : IService1
{
public string GetName()
{
return "Hello World, This is 30sharp.com";
}
}
همانطور که ملاحظه می کنید کلاس Service1 حاوی یه متد به نام GetName می باشد.
با داشتن این قطعه کد، اکنون زمان معرفی آن به موتور تزرویق وابستگی پیشفرض ASP.NET
Core می باشد. برای انجام این کار باید به کلاس Startup.cs مراجعه نموده و داخل متد
ConfigureServices همانند شکل زیر عمل کنیم.
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient(typeof(IService1), typeof(Service1));
services.AddMvc();
}
معرفی نمودن پیاده سازی مورد نظر ما در ASP.NET Core به سه شکل متداول قابل
انجام هست:
- AddTransient: با استفاده از این روش، هر زمان که درخواست
نمونه ای از این کلاس را داشته باشیم، یه نمونه جدید از کلاس ایجاد شده و در
اختیار برنامه قرار می گیرد.
- AddScoped: با استفاده از این روش، به ازای هر درخواست
(HTTP Request) فقط یک نمونه از این کلاس ایجاد شده و در طور حیات این درخواست،
به اشتراک گذاشته می شود.
- AddSingleton: با استفاده از این روش، در طول حیات برنامه
وب، فقط و فقط یک نمونه از این کلاس ایجاد شده و هر زمان که نیاز باشد به
اشتراک گذاشته می شود.
خوب کار تمام است و هم اکنون در تمامی کلاس ها، کنترلر ها و ... به شکل معمول
امکان استفاده از این کلاس وجود دارد.
public class HomeController : Controller
{
private IService1 _service1;
public HomeController(IService1 service1)
{
_service1 = service1;
}
public IActionResult Index()
{
ViewBag.Title = _service1.GetName();
return View();
}
}
اما چگونه می توانیم داخل یک View در خواست نمونه ای از این کلاس را داشته باشیم (صرف نظر از اینکه
اصلا این کار درست و خوبی می باشد یا نه)؟ خوشبختانه این کار نیز به سادگی و با
استفاده از دایرکتیو @inject امکان
پذیر می باشد.
@inject ASPCore1.Services.IService1 service;
<h1>@service.GetName()</h1>
سورس کد انجام شده در این ترفند از لینک
بالای صفحه قابل دریافت می باشد. توجه داشته باشید که برای اجرای کد نیاز به ویژوال
استودیو 2015 و ASP.NET Core 1.0 می باشد.