工作单元、存储库和连接处理

unitofwork, repositories and disposing of connections

我有一个工作单元 class 和一个使用它的存储库 类似这样的事情:

工作单元

private SqlConnection _conn;
private TransactionScope _ts;

public UnitOfWork(SqlConnection conn, TransactionScope ts)
{
    _ts = ts;
    _conn = conn;
    _conn.EnlistTransaction(Transaction.Current);
}

public SqlConnection Connection
{
    get { return _conn; }
}

public void Save()
{
    _ts.Complete();
}

#region IDisposable

public void Dispose()
{
    if (_conn != null)
    {
        _conn.Dispose();
        _conn = null;
    }

    if (_ts != null)
    {
        _ts.Dispose();
        _conn = null;
    }
}

存储库

SqlConnection _conn;

public Repository(IUnitOfWork uow)
{
    _conn = uow.Connection;
}
// some methods
public void Dispose()
{
    if (_conn != null)
    {
        _conn.Dispose();
        _conn = null;
    }
}

我是这样用的

using (var uow = new UnitOfWork())
{
    using (var repo = new Repository(uow))
    {
        if (repo.UpdateStuff())
        {
            uow.Save();
        }
    }
}

在 repo 中首先调用了 dispose 方法,它处理并取消连接。但是当我们到达 uow dispose 时,连接不再为 null 并被释放 'again' 我确定我很无聊,但是有人可以解释一下吗

谢谢

语句右边

_conn = uow.Connection;

实际上 returns 对象引用的副本,而不是引用本身。

因此,您在 Repository Dispose 方法中设置为 null 的是对连接的本地引用,这与 UnitOfWork 实例中的连接引用不同。

如果您真的想保持这种行为(通过存储库代码将 UnitOfWork 连接 属性 设置为空),您必须将 uow.Connection 设置为空,而不是本地引用 _conn。