الـ Dependency Injection في الـ ASP.NET MVC

16 مايو 2017     325 مشاهدة    0 تعليق
تم النشر في #Dependency Injection  #MVC 

سنتعرف اليوم على النمط Dependency Injection في تقنية الـ ASP.NET MVC, ولكن قبل هذا دعونا نتعرف ولو قليلاً على هذا النمط البرمجي وفائدته.

في البرمجة الكائنية Object Oriented Programming تتعامل الكائنات مع بعضها البعض لتحقيق الهدف المنشود, وهذا التعامل أو التعاون يتطلب في بعض الأحيان على أن بعض الكائنات تعتمد على غيرها, ونضطر من إنشاء كائنات كلما تطلبت الحاجه, ولكن هذا قد يزيد الموضوع صعوبة, لأن المبرمج هو المسئول أولاً وآخراً عن إنشاء تلك الكائنات وإدارتها وإزالتها .. إلخ, لهذا فنحن بحاجه إلى حاويه Container لحفظ الكائنات وإعتمادياتها بمعنى آخر من يعتمد على الآخر.

فالـ Dependency Injection هو نمط تصميم برمجي Design Pattern و تطبيق لمفهوم الـ Inversion of Control (IoC) يقوم بحل مشكلة الإعتمادية بين الكائنات وإدارتها , وهنالك العديد من الأطر التي تقوم بعمل هذا الشيء ومنها الـ Unity وهو الذي سنتطرق له في مقالة اليوم.

لنفترض أن لدبنا صفحة التواصل Contact Us والتي نحتاج فيها إلى إرسال بريد إلكتروني, فالـ HomeController في مثالنا سيحتاج خدمه إرسال البريد ولتكن EmailService فالكائن من النوع HomeController يعتمد إعتماداً كلياً على تلك الخدمه

public class HomeController : Controller
{
    private readonly IMessagingService _messagingService;

    public HomeController(IMessagingService messagingService)
    {
        _messagingService = messagingService;
    }

    public ActionResult Contact()
    {
        return View();
    }
    ...
}

فعند تطبيق المثال السابق سيظهر لنا خطأ, لأن الـ HomeController يحتاج كائن من نوع IMessagingService, لذا سنقوم بإستخدام الإطار Unity على النحو التالي:

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        container.RegisterType<IMessagingService, EmailService>();
    }
}

فقمنا بإستخدام الفئة UnityContainer ومن ثم قمنا بتسجيل جميع الكائنات المراد إدارتها في الحاويه بإستخدام الإجراء RegisterType.

وأخيراّ نحتاج إلى إستدعاء الإجراء RegisterComponent() في بداية التشغيل في الـ Global.asax على النحو التالي:

protected void Application_Start()
{
    UnityConfig.RegisterComponents();
    ...
}

والآن عند تشغيل التطبيق سيتم إنشاء كائن من نوع EmailService وتمريره للـ HomeController.

هذا ببساطه كيفية التعامل مع الـ Dependency Injection في تقنية الـ ASP.NET MVC وأرجو القراءة بتعمق عن هذا النمط الرائع وكذلك التعرف على أنواع آخرى من الإطر مثل الـ AutoFact, StructureMap وغيرهما.

تويتر فيسبوك قوقل + لينكد إن


اكتب تعليقك