2009-04-19 33 views
3

我一直在閱讀Misko Hevery的Guide: Writing Testable Code誰負責在無初始化依賴注入方案中附加偵聽器?

我絕對購買依賴注入作爲一個偉大的工具來提高可測試性,並在我的代碼中使用它。然而,當閱讀指南的第一部分「Flaw #1: Constructor does Real Work」時,我發現我對你如何連接事件監聽器仍然有點模糊。

比方說,我有一個類,爲了正常工作,需要將偵聽器附加到通過構造函數依賴注入傳入的參數之一。根據指南,構造函數應該只將它的參數賦值給成員變量,並且不要做其他工作。另外,當構造函數完成時,該對象應該完全初始化。然而,在這種情況下,我不認爲該對象被完全初始化,除非它需要監聽器被連接。

據我所知,這需要連接構建器或工廠中的所有偵聽器,儘管這看起來與對象本身非常脫鉤,並且容易失去同步。另外(至少在動作中,我花了大部分時間在這些日子裏),這意味着我的事件監聽器不再是私有的,因爲工廠/構建器需要看到它們。

處理這個問題的最佳方法是什麼?我在這裏錯過了另一個選項嗎?

+0

監聽器對象的生命週期是什麼?他們活得比你的主要對象長嗎?如果它們比主對象的生命週期短,則不應通過構造函數傳遞它們。 – Runcible 2009-05-04 18:45:08

回答

1

獨立從對象創建

具體業務邏輯(調用圖):如果需要House爲了初始化的Kitchen正常工作,初始化的Kitchen應傳遞到House構造。

House不應該負責初始化Kitchen。這是別人的責任。 (可能是誰建立了廚房的第一名。)

但是,有一個小問題:如果對象的壽命比House短,它不屬於成員變量。例如:PersonOwner可能不應通過構造函數傳入。它應該通過函數調用傳入。

Misko's latest article on managing object lifetimes talks about this subject.

1

一個常見的模式是將佈線移動到一個初始化()或啓動()方法,和把你的依賴注入容器的生命週期的機制的優勢,以確保該方法被調用。

在我當前的項目中,我們將註釋與Spring和Spring.NET的bean後處理器結合起來,以將事件監聽器連接到方法。