哪个班级应该负责州和清理资源?

时间:2011-06-03 17:26:37

标签: oop architecture

我在父类中创建并传递以在子类中使用的数据库连接(我猜它可能是任何有状态的资源)。

哪个类应该负责清理数据库连接(在异常等情况下关闭连接)?

哪个类应该对对象的状态负责(打开/关闭连接)?

例如:

public class Parent
{
    using(var dbConnection = new SqlConnction(connectionString))
    {
        var child = new Child(dbConnection);
        child.MethodUsingTheConnectionPassedInTheConstructor();
    }
}

public class Child
{
    private readonly IDbConnection _dataBaseConnection;

    public Child(IDbConnection dbConnection)
    {
        _dataBaseConnection = dbConnection;
    }

    public MethodUsingTheConnectionPassedInTheConstructor()
    {
        try
        {
            _dataBaseConnection.Open();
            ...
        }
        finally
        {
            _dataBaseConnection.Close();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

使用提供者模式也许是一个好主意:您只传递有关如何获取连接的描述,而不是向子提供实际连接。这样,您就可以在本地管理资源,优化(缩短)已分配资源的生命周期并在本地处理错误。

如果您不想使用单独的提供程序类,可以使用以下内容:

public class Parent
{
    var child = new Child(() => new SqlConnction(connectionString));
    child.MethodUsingTheConnectionPassedInTheConstructor();
}

public class Child
{
    private readonly Func<IDbConnection> _connProvider;

    public Child(Func<IDbConnection> connProvider)
    {
        _connProvider = connProvider;
    }

    public MethodUsingTheConnectionPassedInTheConstructor()
    {
        using(var connection = _connProvider())
        {
        }
    }
}

答案 1 :(得分:0)

创建它的班级应该负责清理它。