using (var unitOfWork = new UnitOfWork()){ // Call the data access module and don't worry about transactions. // Let the Unit of Work open a session,begin a transaction and then commit it.}
这就是我到目前为止(如果您认为我的设计错误,欢迎任何评论):
class UnitOfWork : Idisposable{ ISession _session; ITransation _transaction; . . . voID dispose() { _transaction.Commit(); _session.dispose(); }}
我想要做的是回滚事务,以防数据访问代码抛出一些异常.所以dispose()方法看起来像:
voID dispose() { if (dispose was called because an exception was thrown) { _transaction.Commit(); } else { _transaction.RollBack(); } _session.dispose(); }
是否有意义?如果是这样,怎么办呢?
解决方法 “dispose()”应该与事务提交或回滚无关.您应该在dispose()方法中处理事务.更改dispose()方法的语义只会为您和使用您的类的其他任何人带来混乱.事务的Commit()和RollBack()方法与dispose()方法没有任何关系,因为这两个方法和dispose()之间没有关联,因为无论最终结果如何,都必须处理事务.
这是关于连接和事务使用的正确模式.注意Roolback(0与异常有关(而不是处置)
connection.open();var trasnaction = null;try{ transaction = connection.BeginTransaction(); ///Do Some work transaction.Commit();}catch{ transaction.Rollback();}finally{ if (transaction != null) transaction.dispose(); connection.Close();}
因此,使用Commit(),Roolback()和dispose()方法在UnitOfWork中模仿这种模式.
总结以上是内存溢出为你收集整理的c# – Dispose()如何知道它是因为异常而调用的?全部内容,希望文章能够帮你解决c# – Dispose()如何知道它是因为异常而调用的?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)