Skip to content

3. انعكاس التحكم (IoC)

لنركز الآن على مفهوم انعكاس التحكم (IoC) الذي يستخدمه Spring لتكوين التطبيقات. لتوضيح هذا المفهوم، لنعد إلى بنية تطبيق الاختبار السابق:

للوصول إلى البيانات من نظام إدارة قواعد البيانات (DBMS)، يجب أن تستخدم فئة الاختبار خدمات كائن ينفذ واجهة [IArticlesDao]، على سبيل المثال، كائن من النوع [ArticlesDaoPlainODBC]. لقد درسنا حلين ممكنين لإنشاء مثيل لمثل هذا الكائن:

  • في الحل الأول، طلبت فئة الاختبار نفسها إنشاء مثيل لكائن من النوع [ArticlesDaoPlainODBC]:
    <TestFixture()> _
    Public Class NunitTestArticlesDaoPlainOdbc

        ' the test object
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
            ' create an instance of the object to be tested
            articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
        End Sub
...
    End Class

هناك تبعية مبرمجة بشكل ثابت على اسم الفئة في الكود. إذا تغيرت الفئة التي تنفذ واجهة [IArticlesDaoفسيكون من الضروري تعديل الكود الموجود في الأسلوب [init]. توجد العلاقات التالية بين الكائنات:

تقوم الفئة [NunitTestArticlesDaoPlainOdbc] بمبادرة إنشاء الكائن [ArticlesDaoPlainODBC] الذي تحتاجه. بالعودة إلى مصطلح "انعكاس التحكم"، يمكننا القول إنها هي التي تمتلك "التحكم" في إنشاء الكائن الذي تحتاجه.

  • الحل الثاني يتبع نهجًا مختلفًا. أصبحت فئة الاختبار كما يلي:
    <TestFixture()> _
    Public Class NunitSpringTestArticlesDaoPlainOdbc

        ' the test object
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
      ' retrieve an instance of the Spring object manufacturer
            Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
      ' request instantiation of the articles dao object
            articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
        End Sub
    ...
    End Class

يمكن تلخيص هذه الآلية على النحو التالي:

هنا، لا تأخذ فئة الاختبار زمام المبادرة لطلب إنشاء كائن [ArticlesDaoPlainODBC]. بل تطلب ببساطة من Spring مرجعًا إلى هذا الكائن. إذا كان الكائن موجودًا، يعرض Spring مرجعًا إليه. وإذا لم يكن موجودًا، يقوم Spring بإنشائه. فقدت فئة الاختبار السيطرة على إنشاء كائن [ArticlesDaoPlainODBC]. فهي تطلب ببساطة مرجعًا إلى هذا الكائن. سيجبر هذا الطلب Spring على إنشاء الكائن في هذه الحالة. ومع ذلك، في سياق آخر، يمكن للمرء أن يتخيل أن الكائن المطلوب قد تم إنشاؤه بالفعل بناءً على طلب التطبيق. عندئذٍ لا يعيد Spring إنشاء الكائن بل يعيد مرجعًا إلى الكائن الموجود (singleton). يعني مفهوم انعكاس التحكم (IoC) هنا:

  • أن التطبيق لا يأخذ أبدًا زمام المبادرة لإنشاء الكائنات الفردية التي يحتاجها. بل يطلب ببساطة إشارات إليها.
  • Spring هو الذي يقرر إنشاء كائن فريد عند أول طلب للحصول على مرجع إليه