مثال نموذجي باستخدام Asp.net core
رابط الفيديو المسجل: https://www.youtube.com/watch?v=oVj1IHw8GLU
نظرة عامة على DI: https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
يدعم ASP.NET Core نمط تصميم برنامج حقن التبعية (DI)، وهو أسلوب لتحقيق عكس التحكم (IoC) بين الفئات وتبعياتها.
من خلال حاوية IoC، يمكننا تحقيق ذلك
في Asp.net core، تحتوي حاوية IoC على واجهات مدمجة.
ستكون دورة حياة DI التالية
يوجد أساسًا نوعان من الخدمات في ASP.NET Core:
خدمات إطار العمل: الخدمات التي تعد جزءًا من إطار عمل ASP.NET الأساسي مثل IApplicationBuilder وIHostingEnvironment وILoggerFactory وما إلى ذلك.
خدمات التطبيقات: الخدمات (الأنواع أو الفئات المخصصة) التي تقوم بإنشائها كمبرمج لتطبيقك.
تطلب وحدة التحكم Asp.Net Core MVC التبعيات بشكل صريح عبر المُنشئات 1. حقن المُنشئ 2. حقن الطريقة (مستوى الإجراء) 3. حقن الملكية (غير مدعوم) 4. عرض الحقن
حقن المُنشئ: - تتم إضافة الخدمات كمعلمة مُنشئ ويقوم وقت التشغيل بحل الخدمة من حاوية الخدمة (IServiceCollection--DiContainer). يتم تعريف الخدمات (أ) عادةً باستخدام فئة (واجهات) غير ملموسة
حقن الطريقة: - يتيح استخدام سمة [FromService] حقن الخدمة مباشرة في طريقة الإجراء دون استخدام حقن وحدة التحكم
لا تدعم حاوية IOC المدمجة حاليًا (Asp.net core) حقن الخاصية حقن الخاصية. ولهذا يمكنك استخدام حاويات الخدمة المضمنة (IOC) التابعة لجهات خارجية.
عرض الحقن باستخدام التوجيه [Inject] يتيح حقن الخدمة مباشرة في صفحة العرض دون استخدام وحدة التحكم أو إدخال الطريقة
تدعم حاوية IoC المدمجة ثلاثة أنواع من العمر:
في نموذج المثال، تحدد واجهة خدمة "IMyDependency" أسلوب "WriteMessage".
public interface IMyDependency
{
void WriteMessage(string message);
}
يتم تنفيذ هذه الواجهة بواسطة نوع ملموس، MyDependency:
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
الآن، قم بتسجيل خدمة "IMyDependency" بالنوع المحدد "MyDependency" (في ملفstartup.cs)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
هنا يتم استخدام طريقة Add() لمثيل "IServiceCollection" لتسجيل خدمة باستخدام حاوية IoC. يتم استخدام "ServiceDescriptor" لتحديد نوع الخدمة والتنفيذ الملموس. سيؤدي هذا إلى تسجيل خدمتنا في الحاوية افتراضيًا باسم "Singleton"
الآن، دعونا نحقن الخدمات بأوقات حياة مختلفة
Singleton (حالة الاستخدام: عندما نحتاج إلى إنشاء خدمة حالة):
Services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
عابر (حالة الاستخدام: عندما نحتاج إلى إنشاء خدمة عديمة الجنسية):
Services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
النطاق (حالة الاستخدام: خدمة قاعدة البيانات):
Services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Scoped));
يمكننا أيضًا حقن الخدمات باستخدام طرق التمديد المضمنة
سينجلتون
Services.AddSingleton
عابر
Services.AddTransisent
نطاق
Services.AddScoped
public class HomeController: Controller { خدمة IMyDependency الخاصة للقراءة فقط؛
public HomeController(IMyDependency service)
{
_service = service;
}
public IActionResult Index()
{
_service.WriteMessage("Constructor level injection")
return View();
}
}
public class HomeController : Controller
{
//Fromservice attribute
public IActionResult Index([FromService]IMyDependency service)
{
service.WriteMessage("Action level injection")
return View();
}
}
الطبقة العامة HomeController: وحدة التحكم {
public IActionResult Index()
{
return View();
}
}
في Index.cshtml
@{ ViewData["Title"] = "الصفحة الرئيسية"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
الطبقة العامة HomeController: وحدة التحكم {
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var dependencyservice = (IMyDependency)services.GetService(typeof(IMyDependency));
dependencyservice.WriteMessage("without injection, accessing dependent services");
return View();
}
}