有没有办法在 Disposable
对象中创建嵌套使用,所以这段代码:
using (var ctx = new MyEntities())
{
ctx.Connection.Open();
using (var tx = dbContext.Connection.BeginTransaction())
{
// ... do awesome things here
ctx.SaveChanges();
tx.Commit();
}
}
像这样:
using (var txContext = new TransactionContext())
{
// ... do awesome things here
}
?
目前我有:
public class TransactionContext : IDisposable
{
private MyEntities DbContext { get; set; }
private DbTransaction Transaction { get; set; }
public TransactionContext()
{
DbContext = new MyEntities();
DbContext.Connection.Open();
Transaction = DbContext.Connection.BeginTransaction();
}
void IDisposable.Dispose()
{
try
{
DbContext.SaveChanges();
Transaction.Commit();
}
catch (Exception exception)
{
Transaction.Rollback();
DbContext.Dispose();
}
}
}
我不确定这在处理不同的Disposables
方面是否正确,特别是在出现错误/异常的情况下。
最佳答案
为此使用方法而不是类可能会更好。
private static void RunInTransaction(Action<MyEntities, DbTransaction> action)
{
using (var ctx = new MyEntities())
{
ctx.Connection.Open();
using (var tx = ctx.Connection.BeginTransaction())
{
action(ctx, tx);
ctx.SaveChanges();
tx.Commit();
}
}
}
然后你就可以这样调用它。
RunInTransaction((ctx,tx) =>
{
// ... do awesome things here
});
您还可以创建一个返回值的版本
private static T RunInTransactionAndReturn<T>(
Func<MyEntities, DbTransaction, T> function)
{
using (var ctx = new MyEntities())
{
ctx.Connection.Open();
using (var tx = ctx.Connection.BeginTransaction())
{
var result = function(ctx, tx);
ctx.SaveChanges();
tx.Commit();
return result;
}
}
}
然后你就可以这样调用它。
var result = RunInTransactionAndReturn((ctx,tx) =>
{
// ... do awesome things here
return someResult;
});
关于c# - 如何避免重写相同的 using 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32524676/