Layered design in software engineering

1-Dependency injection: Inversion of Control

 عرفنا فى المقاله السابقه  أن ال HomeController  بتستخدم Object من نوع IDatabase وبكدا ال HomeController تقدر تستخدم اي Class بتعمل Implementation ل IDatabase وقلنا كدا أن احنا قدرنا نحقق ال Loosely Coupled بين الـ HomeController وبين ال Class اللى بتستخدمها سواء SQLServer او MySql.

بس لحد الان الـ HomeController هي المسؤولة عن ال Creation لـ Objects لـ  dependencies اللى هتستخدمهم ومسؤله عن ال LifeTime الخاص بيهم.

بمعنى اخر  احنا فصلنا بين ال HomeControler وال MySql و SqlServer عن طريق ال IDatabase  وبكدا ال HomeController لن تتعامل معهم بشكل مباشر  بس ال HomeController مسؤله عن عمل Creation للـ Object اللى هتستخدمه وتحديد نوعه.


ex: IDatabase = new MySql() or IDatbase = new SqlServer() and so on

وهنا هنقدم ال Inversion of Control

Inversion of Control is a principle in software engineering which transfers the control of objects or portions of a program to a container or framework 

فى المثال السابق الـ HomeController هي المسؤولة عن ال creation لل Dependencies اللى بتستخدمها وبكدا هى اللى بتعمل control لل objects ,ودا يعتبر مهمة إضافية للـ HomeController انها تتحكم فى ال objects of  dependencies  .

ال  Inversion  Of Control واختصاراً IoC   هو مبدأ  ويقترح أن التحكم فى ال dependencies هو  خارج اختصاص  المهام الرئيسيه لل Class  اللى بتستخدم ال dependencies  ومن أجل حل هذه المشكلة. 

لازم يكون عندنا class او framework  مسؤلين عن التحكم فى ال objects  مثل ال creation وال lifetime.

يعنى لو عاوزين نستخدم object من نوع IDatabase  هنروح نطلب من ال class او ال framework اياً كان ,وال Framework هيوفر لينا ال Objects اللى احنا عاوزينه .


ال IoC هو مبدأ فى اكتر من طريقه ممكن ننفذه بيها:

1-Strategy design pattern

2-Service Locator pattern

3-Factory pattern

4-Dependency Injection (DI)

باستخدام ال Dependency Inversion Principle وال Inversion of Control  هنكون حققنا الهدف الاساسى بأن العلاقه هتكون Loosely Coupled بين الـ HomeController  وال dependencies.





 

تعليقات