Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有IDisposable构造函数依赖项的组件是否应为IDisposable?_C#_.net_Castle Windsor - Fatal编程技术网

C# 具有IDisposable构造函数依赖项的组件是否应为IDisposable?

C# 具有IDisposable构造函数依赖项的组件是否应为IDisposable?,c#,.net,castle-windsor,C#,.net,Castle Windsor,这是我的班级: public class TaskLogger : ITaskLogger { private readonly IDbConnection _dbConnection; public TaskLogger(IDbConnection dbConnection) { _dbConnection = dbConnection; } public void LogTask(int clientId, string taskN

这是我的班级:

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?

否。由于实例是从调用者传递给类的,因此调用者负责处理它。这是因为您的类不应假定它是此实例的唯一使用者-可能有另一个类使用相同的连接,但比您的
TaskLogger
实例寿命更长

您的类应该处理它自己创建的实例


另一种方法是添加构造函数
公共任务记录器(IDbConnection dbConnection,bool closeConnection)
,并在传入的值为
true
时处理连接。此方法由使用(尽管他们使用另一种方法,并使用
leaveOpen
——但对于流,情况不同,因为通常一个流不会被多个实例同时使用)。

同意,尽管我必须指出.Net CLR中有一些类处理传递给构造函数的项,例如(我一直认为这是个坏主意!)是的,我想你的第一句话是这样说的——一个类,它不负责注入依赖项的生命周期。我在找一些确认,所有的“只是”在温莎。因为在这种方法中,我们假设DI容器是负责的,并且实际上会处理它。当使用DI时,您不应该处理您甚至不拥有的实例——因为主要思想是框架控制这些实例的使用方式。例如,连接可能是单例的,但每个线程的记录器。。。由于此DI框架将处理处置。您甚至可以进一步说,如果您使用Windsor来解析(),那么您可能不应该使用Dispose(),而应该使用Release()。如果组件实现IDisposable,Windsor将确保在适当的时间调用Dispose()。例如,通过自己调用Dispose(),您可以硬编码关于组件寿命的假设,理想情况下,这些假设应该由注册/配置控制。“释放你所决定的一切”这条简单的规则似乎对我和温莎的关系总是很好。