Skip to content

3. Kontrolün Tersine Çevrilmesi IoC

Şimdi, Spring'in uygulamaları yapılandırmak için kullandığı kontrol tersine çevirme (IoC, Inversion of Control) kavramı üzerinde duralım. Bu kavramı açıklamak için önceki test uygulamamızın mimarisine geri dönelim:

SGBD verilerine erişmek için, test sınıfı [IArticlesDao] arayüzünü uygulayan bir nesnenin hizmetlerini kullanmalıdır; örneğin, [ArticlesDaoPlainODBC] türünde bir nesne. Böyle bir nesneyi örneklendirmek için iki olası çözümü inceledik:

  • İlk çözümde, test sınıfı [ArticlesDaoPlainODBC] türünde bir nesnenin oluşturulmasını kendisi talep ediyordu:
    <TestFixture()> _
    Public Class NunitTestArticlesDaoPlainOdbc

         ' test edilecek nesne
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
             ' test edilecek nesnenin bir örneği oluşturulur
            articlesDao = New ArticlesDaoPlainODBC("odbc-firebird-articles", "SYSDBA", "masterkey")
        End Sub
...
    End Class

Kodda sınıf adına sabit bir bağımlılık var. [IArticlesDao] arayüzünün uygulama sınıfı değişirse, [init] yönteminin kodu da değiştirilmelidir. Nesneler arasında aşağıdaki ilişkiler vardır:

[NunitTestArticlesDaoPlainOdbc] sınıfı, ihtiyaç duyduğu [ArticlesDaoPlainODBC] nesnesini kendi inisiyatifiyle oluşturur. "Kontrolün tersine çevrilmesi" terimine geri dönersek, ihtiyaç duyduğu nesneyi oluşturma "kontrolü"nün bu sınıfa ait olduğunu söyleyebiliriz.

  • İkinci çözüm ise farklı bir şekilde ilerler. Test sınıfı şu şekilde olmuştur:
    <TestFixture()> _
    Public Class NunitSpringTestArticlesDaoPlainOdbc

         ' test edilecek nesne
        Private articlesDao As IArticlesDao

        <SetUp()> _
        Public Sub init()
       ' Spring nesne oluşturucusunun bir örneği alınır
            Dim factory As XmlObjectFactory = New XmlObjectFactory(New FileStream("spring-config-plainodbc.xml", FileMode.Open))
       ' articles dao nesnesinin örneklenmesini talep ediyoruz
            articlesDao = CType(factory.GetObject("articlesdao"), IArticlesDao)
        End Sub
    ...
    End Class

Bu mekanizma şu şekilde şematize edilebilir:

Burada, test sınıfı bir [ArticlesDaoPlainODBC] nesnesinin oluşturulmasını talep etme inisiyatifini almaz. Sadece Spring'den böyle bir nesneye ilişkin bir referans talep eder. Nesne mevcutsa, Spring bir referans döndürür. Mevcut değilse, onu oluşturur. Test sınıfı, [ArticlesDaoPlainODBC] nesnesinin oluşturulması üzerindeki kontrolünü kaybetmiştir. Sadece bu nesneye ait bir referans talep eder. Bu talep, burada Spring'i nesneyi oluşturmaya zorlayacaktır. Ancak başka bir bağlamda, talep edilen nesnenin uygulama tarafından daha önce oluşturulmuş olabileceğini de düşünebiliriz. Bu durumda Spring, nesneyi yeniden oluşturmaz, ancak zaten var olan nesneye (singleton) bir referans döndürür. Kontrolün Tersine Çevrilmesi (IoC) kavramı burada şu anlama gelir:

  • uygulamanın ihtiyaç duyduğu singletonları asla kendi inisiyatifiyle oluşturmamasıdır. Uygulama sadece bunlara ilişkin referanslar talep eder.
  • Singleton'a yönelik ilk referans talebi sırasında, singleton'ı oluşturma kararını Spring verir