工作单元、存储库和连接处理
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。
我有一个工作单元 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。