有沒有一種方法來創建一個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
的方式是正確的,尤其是在一個錯誤/異常的情況。
我想說這個設計的主要問題是,它使用一次性模式不僅僅是處理。如果在'using'中發生異常,那麼將會調用Dispose,現在當你可能不應該調用'SaveChanges'和'Commit'時。請閱讀有關[處理模式]的MSDN文章(https://msdn.microsoft.com/en-us/library/b1yfkh5e(v = VS.110).aspx) – juharr
備註:不要只是*吞下*異常:catch(Exception){... throw;}' –
@juharr:有效的點。你有沒有其他解決方案?最後,它只是爲了避免我一遍又一遍地寫同一行 – KingKerosin