Skip to content

3. معکوس‌سازی کنترل IoC

اکنون بیایید به مفهوم معکوس‌سازی کنترل (IoC, Inversion of Control) که توسط Spring برای پیکربندی برنامه‌ها استفاده می‌شود، نگاهی بیندازیم. برای تشریح این مفهوم، بیایید به معماری برنامه آزمایشی قبلی خود بازگردیم:

برای دسترسی به داده‌ها در SGBD، کلاس تست باید از خدمات یک شیء که رابط [IArticlesDao] را پیاده‌سازی می‌کند، استفاده کند، برای مثال یک شیء از نوع [ArticlesDaoPlainODBC]. ما دو راه‌حل ممکن برای نمونه‌سازی چنین شیء‌ای را بررسی کرده‌ایم:

  • در راه‌حل اول، خود کلاس تست، نمونه‌سازی یک شی از نوع [ArticlesDaoPlainODBC] را درخواست کرد:
    <TestFixture()> _
    Public Class NunitTestArticlesDaoPlainOdbc

         ' شیء تحت آزمون
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
             'یک نمونه از شیء تحت آزمون ایجاد می‌شود
            articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
        End Sub
...
    End Class

در کد، وابستگی سخت‌کدشده‌ای به نام کلاس وجود دارد. اگر کلاسی که رابط [IArticlesDao] را پیاده‌سازی می‌کند تغییر کند، کد متد [init] باید اصلاح شود. روابط زیر بین اشیاء وجود دارد:

کلاس [NunitTestArticlesDaoPlainOdbc] خود ابتکار عمل را برای ایجاد شیء [ArticlesDaoPlainODBC] که به آن نیاز دارد، به دست می‌گیرد. با بازگشت به اصطلاح «معکوس‌سازی کنترل»، می‌توان گفت که این کلاس است که «کنترل» ایجاد شیء مورد نیاز خود را در اختیار دارد.

  • راه حل دوم رویکرد متفاوتی را در پیش می‌گیرد. کلاس تست به شکل زیر درآمده است:
    <TestFixture()> _
    Public Class NunitSpringTestArticlesDaoPlainOdbc

         ' شیء تحت آزمون
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
       'بازیابی یک نمونه از کارخانهٔ اشیاء Spring
            Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
       'درخواست ایجاد شیء DAO «articles»
            articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
        End Sub
    ...
    End Class

این مکانیزم را می‌توان به شرح زیر خلاصه کرد:

در اینجا، کلاس تست ابتکار عمل را برای درخواست ایجاد یک شیء [ArticlesDaoPlainODBC] به دست نمی‌گیرد. این کلاس صرفاً از Spring یک مرجع به چنین شیئی را درخواست می‌کند. اگر شیء وجود داشته باشد، Spring یک مرجع به آن را برمی‌گرداند. اگر وجود نداشته باشد، Spring آن را ایجاد می‌کند. کلاس تست کنترل ایجاد شیء [ArticlesDaoPlainODBC] را از دست داده است. این کلاس صرفاً یک مرجع به این شیء را درخواست می‌کند. در این حالت، این درخواست اسپرینگ را مجبور به ایجاد شیء می‌کند. با این حال، می‌توان تصور کرد که در یک زمینه متفاوت، شیء مورد درخواست قبلاً به درخواست برنامه ایجاد شده باشد. در این حالت، اسپرینگ شیء را دوباره ایجاد نمی‌کند، بلکه مرجعی به شیء موجود (سینگلتون) برمی‌گرداند. مفهوم معکوس‌سازی کنترل (IoC) در اینجا به این معناست:

  • اینکه برنامه هرگز ابتکار ایجاد نمونه‌های تک‌نفری مورد نیاز خود را بر عهده نمی‌گیرد. بلکه صرفاً درخواست مرجع آن‌ها را می‌دهد.
  • این اسپرینگ است که تصمیم می‌گیرد هنگام اولین درخواست برای یک مرجع، یک نمونهٔ سینگل‌تون ایجاد کند