2013-10-04 50 views
1

這裏是我的類:我的具有IDisposable構造函數依賴項的組件是IDisposable嗎?

public class TaskLogger : ITaskLogger 
{ 
    private readonly IDbConnection _dbConnection; 

    public TaskLogger(IDbConnection dbConnection) 
    { 
     _dbConnection = dbConnection; 
    } 

    public void LogTask(int clientId, string taskName) 
    { 
     _dbConnection.Execute("insert blah",{clientId,taskName}}); 
    } 
} 

我們使用溫莎DI。

應該將TaskLogger聲明爲IDisposable,並處理IDbConnection?

回答

3

不需要。由於實例從調用者傳遞給您的類,調用者負責處理它。這是因爲你的班級不應該認爲它是這個實例的唯一消費者 - 可能會有另一個班級使用相同的連接但壽命比你的TaskLogger實例長。

你的類應該處理它自己創建的實例。

另一種方法是添加構造函數public TaskLogger(IDbConnection dbConnection, bool closeConnection)並在傳入的值爲true時處置連接。這種方法被some System.IO classes使用(雖然他們反過來使用leaveOpen--但是對於流來說它是一個不同的故事,因爲通常一個流不會同時被多個實例使用)。

+0

同意,儘管我必須指出.net CLR中有一些類將配置項傳遞給構造函數,例如['BinaryReader()'](http://msdn.microsoft.com/zh-cn/我/庫/ 2k01zeat.aspx)(我一直認爲這是一個壞主意!) –

+0

是的,我認爲你的第一句話說 - 它不負責注入依賴的生命週期的類。我正在尋找一些確認,這一切都在溫莎的「正常工作」。因爲在這個方法中,我們假設DI容器是負責任的並且實際上會處理它 –

+0

當使用DI時,您不應該處理您不擁有的實例 - 因爲主要思想是框架控制這些實例的方式用過的。例如,連接可能是一個單例,但是每個線程的記錄器......因爲這個DI框架將處理處置。 –