我的项目运行得很好。但是我得到一个CA1063错误,在我压制之前我想看看我是否实现Dispose错误。
它从我定义的接口开始:
public interface IAttributeRepository
{
IDataTransaction BeginTransaction();
Task<IQueryable<AttributeValue>> GetAttributeValues(int parentId);
...etc....
}
请注意,实现此接口的任何内容都必须实现IDataTransaction,所以这就是:
public interface IDataTransaction : IDisposable
{
void Commit();
void RollBack();
}
现在我在我的存储库层中定义了两种类型的SQL交互。简单的,然后是那些应该包含在交易中的。
事务一是我们关心的事情,它被定义为私有类成员var:
private DBTransaction _dbTransaction;
类DBTransaction如下所示: (DbTransaction是System.Data.Entity中的Msoft对象)
public class DBTransaction : IDataTransaction
{
DbContextTransaction _dbcontextTrans;
public DBTransaction(DbContextTransaction dbcontexttrans)
{ _dbcontextTrans = dbcontexttrans; }
public void Commit()
{ _dbcontextTrans.Commit(); }
public void RollBack()
{ _dbcontextTrans.Rollback(); }
public void Dispose()
{ _dbcontextTrans.Dispose(); }
}
最后在存储库类中,它将像这样使用:
public class AttributeRepository : IAttributeRepository
{
public IDataTransaction BeginTransaction()
{
var trans = _DataContext.Database.BeginTransaction(IsolationLevel.ReadCommitted);
_dbTransaction = new DBTransaction(trans);
return _dbTransaction;
}
public async Task<IQueryable<Data.Attribute>> GetAttribute_with_AttributeValues(int id)
{
using (var trans = this.BeginTransaction())
{
//execute sql code you want wrapped in a transaction
//rollback, commit etc based upon result
trans.Commit();
}
}
}
正如我提到的,代码正确执行我只是不确定我理解为什么代码分析告诉我我的处理需要纠正,而在我压制它之前我想要与那些比我更有知识的人进行验证。
TIA
答案 0 :(得分:2)
有用信息:Framework Design Guidelines - Dispose Pattern
这是我在IDisposable
课程上实施DBTransaction
时会遵循的模式:
public class DBTransaction : IDataTransaction
{
....
~DBTransaction() {
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if(_disposed) return;
try
{
// DISPOSE OF UN-MANAGED RESOURCES HERE
if(disposing)
{
// Dispose objects here
_dbcontextTrans.Dispose();
}
}
finally
{
_disposed = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
...
}
如果您是从实现IDisposable
并具有virtual
dispose方法的基类派生的,那么我会这样做:
protected override void Dispose(bool disposing)
{
if(_disposed)
return;
try
{
// DISPOSE OF UN-MANAGED RESOURCES HERE
if(disposing)
{
// Dispose objects here
}
}
finally
{
_disposed = true;
base.Dispose(disposing);
}
}
这与普通Dispose(bool disposing)
非常相似,但在finally
块中,我呼叫base.Dispose(disposing)
。
编辑#1: 更新以考虑@juharr的建议。