Ily*_*gan 8 c# nhibernate exception-handling data-access-layer unit-of-work
我想编写一个简单的工作类单元,其行为如下:
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.
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止(如果您认为我的设计错误,欢迎任何评论):
class UnitOfWork : IDisposable
{
ISession _session;
ITransation _transaction;
.
.
.
void Dispose()
{
_transaction.Commit();
_session.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是回滚事务,以防数据访问代码抛出一些异常.所以该Dispose()方法看起来像:
void Dispose()
{
if (Dispose was called because an exception was thrown)
{
_transaction.Commit();
}
else
{
_transaction.RollBack();
}
_session.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
是否有意义?如果是这样,怎么办呢?
"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();
}
Run Code Online (Sandbox Code Playgroud)
因此,使用Commit(),Roolback()和Dispose()方法在UnitOfWork中模仿这种模式.
毕竟,我实现了一个方法,所有操作都应该通过该方法执行:
class UnitOfWork : IDisposable
{
...
public void DoInTransaction(Action<ISession> method)
{
Open session, begin transaction, call method, and then commit. Roll back if there was an exception.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |