2010-09-18 23 views
1

我知道使用控制反轉的(也許是最好的)方法之一是通過構造函數(構造函數注入)注入依賴對象。我應該在注入期間使用傳遞給構造函數的對象嗎?

但是,如果我打電話給這些對象外部使用它們的對象,我覺得我違反了某種規則 - 是這種情況嗎?我不認爲有什麼辦法可以防止這種情況發生,但是我應該建立一個規則(除了被嘲笑的對象之外),我們不應該從這些對象中調用方法?

[編輯]這是我正在做的一個簡單的例子。我有一個FileController對象,基本上用於編目文件。它使用與數據庫交談的FileDal對象來插入/查詢/更新FileDirectory表。

在我真正的實現中,我通過指示Castle使用SQL Server版本的DAL來構建控制器,在我的單元測試中,我使用內存中的Sqlite版本的DAL。但是,由於DAL的實現方式,我需要在使用FileController時調用BeginTransaction和Commit,以便連接不會關閉,我可以稍後進行檢索和斷言。爲什麼我必須這樣做並不重要,但它讓我認爲調用其他客戶端(控制器)使用的DAL對象上的方法聽起來並不健康。這裏有一個例子:

FileDal fileDal = CastleFactory.CreateFileDal(); 
fileDal.BeginTransaction(); 
FileController fileController = new FileController(fileDal); 
fileController.CallInterestingMethodThatUsesFileDal(); 
fileDal.Commit(); 
+0

我很感興趣的是看到一個簡單的例子,你正在做什麼。這可以讓我們更多地瞭解你的特定情況。 – Steven 2010-09-18 20:04:46

回答

2

它確實取決於對象的類型 - 但總的來說,我希望這樣可以。

確實,相同的依賴關係通常會被注入到很多對象中。例如,如果您有一個IAuthenticator以及需要使用身份驗證的幾個類,則假設他們需要相同的配置,創建一個實例並將其注入到每個相關類中都是有意義的。

通常發現我的依賴是自然線程安全的不可變類型。當然,情況並非總是如此 - 在某些情況下(至少有一些IoC容器),您可能會自動構造依賴項以適應特定的線程或會話 - 但「類似服務」的依賴項通常應該可以調用來自多個地方和線程。

+0

謝謝,喬恩。在我的情況下,他們大多是DAL對象,你確實是正確的,他們通過Castle創建,然後傳遞給各種「控制器」。我問,因爲我正在編寫單元測試,而且我必須發起並終止客戶端對象之外的一個事務*,這種感覺不正確。哦,順便說一句,我*不*與真正的數據庫交談,我正在使用內存中的Sqlite進行單元測試。 – 2010-09-18 19:37:46

相關問題