2013-10-04 19 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框架将处理处置。 –