2015-05-01 99 views
0

比方說,我有以下代碼:spring4d解決局部構造類

interface 
     type 
      IMyInterface1 = interface // GUID 
      procedure ButtonEvent(Sender: TObject); 
      end; 

      IMyInterface2 = interface // GUID 
      procedure DoSomething; 
      end; 

      TMyClass1 = class(TInterfacedObject, IMyInterface1) 
      public 
      procedure ButtonEvent(Sender: TObject); 
      end; 

      TMyClass2 = class(TInterfacedObject, IMyInterface2) 
      public 
      procedure DoSomething; 
      end; 

// ... 
implementation   
     procedure TMyClass1.ButtonEvent(Sender: TObject); 
     var 
      aIntf2: TMyInterface2; 
     begin 
      // Pseudo code: 
      // aIntf2 := ServiceLocator.GetService<IMyInterface2>; 
      try 
      aIntf2.DoSomething; 
      finally 
      aIntf2 := nil; // will free the instance... 
      end; 
     end; 

    initialization 
     // Pseudo code: 
     // GlobalContainer register IMyInterface1/TMyClass1 
     // GlobalContainer register IMyInterface2/TMyClass2 
     // GlobalContainer.Build 
    end. 

方法ButtonEvent由Delphi窗體按鈕單擊事件被調用。

現在我的問題: 有沒有更好的方式來實例化類TMyClass2? 在我的情況下無法注入到類TMyClass1中,TMyClass2實例的生命週期僅在ButtonEvent內部。 下一個調用ButtonEvent應該使用不同的實例...在這個Spring4D中,AFAIK,方法參數注入或局部變量注入是不可能的,是不是?

回答

1

如果你想避免可怕的服務定位器模式,它不能解決DI解決但只是改變它的問題(或者在很多情況下甚至會讓事情變得更糟,因爲你的僞解耦代碼仍然具有隻依賴你的經驗一旦你運行代碼並發現你必須註冊一些類型才能使服務定位器返回正確的東西)。

方法參數注入或局部變量注入?那怎麼可能。爲了讓容器向寄存器/堆棧中注入某些內容,需要對該調用進行一些攔截。

雖然攔截是可能的某些方法(虛擬的),仍然需要被設置爲被叫實例。如果你這樣做了,你可以首先注入你的依賴。

如果你不把DI在你的作文根你總是要使用某種類型的服務定位器的代碼中要從哪裏開始依賴注入的進程。 DI的

思考,尤其是使用的容器作爲工具來實現特定的東西:多去耦你的代碼,它的各種好處。正如我所說的,在這種情況下使用服務定位器會導致比解決問題更多的問題。

但是回到您的示例:這是使用工廠的經典案例。你需要將它注入到TMyClass1中。然後它可以在您的方法中調用工廠並檢索IMyInterface2。根據您使用的Spring4D版本的不同,容器可以爲您節省一些工作,因爲它可以爲您構建工廠。但我建議你使用經典模式自己寫工廠。這樣你就能感受到它。稍後,當您對其使用有更多的經驗和信心時,使用容器的地方可以輕鬆地接管該部分。

+0

好的......現在我明白了......工廠是一個很好的解決方案。 使用代理如java spring的方法或參數注入怎麼辦? 這種面向方面的編程也可能有一天... – Markus

+0

轉到我們的論壇(鏈接在我們的項目頁面上),並用一些例子問那個問題,這樣我就能明白你到底想要達到什麼目的。我不認爲這種討論可以或應該在這裏處理。 –

+0

我所看到的,Spring容器有一個方法來註冊工廠: TContainer.RegisterFactory 1.是否有關於如何使用它的一個例子嗎? 2.我可以讓spring4d爲注入的實例注入嗎? – Markus