【发布时间】:2011-10-20 21:15:29
【问题描述】:
我正在使用 asp.net mvc 和 nhibernate 与工作单元模式。
我有这样的事情
public bool IsSomething()
{
unitOfWork.BeginTransaction();
var myGetStuff = repo.GetStuff(1);
if(myGetStuff == null)
{
return false;
}
var somethingElse = myGetStuff.GetSomethingElse();
if(somethngElse == null)
{
return false;
}
return true;
}
因此,在我的 if 语句中,如果某些内容为 null 并且我需要它不为 null,我就退出该语句。
这与嵌套 if 语句相反,它可能像嵌套 4 或 5 次一样进行空值检查。
public bool IsSomething()
{
unitOfWork.BeginTransaction();
var myGetStuff = repo.GetStuff(1);
if(myGetStuff != null)
{
var somethingElse = myGetStuff.GetSomethingElse();
if(somethngElse != null)
{
// some more check heere ( could have another few if statements null checks here)
}
}
}
所以我发现第一种方法比 if 语句的嵌套级别更容易阅读。
我的问题是,即使您在 nhibernate 中执行查询,您必须将其包装在事务中,最后执行回滚或提交。
选项 1
public bool IsSomething()
{
unitOfWork.BeginTransaction();
var myGetStuff = repo.GetStuff(1);
if(myGetStuff == null)
{
unitOfWork.Commit();
return false;
}
var somethingElse = myGetStuff.GetSomethingElse();
if(somethngElse == null)
{
unitOfWork.Commit();
return false;
}
unitOfWork.Commit();
return true;
}
我不喜欢这种方式,因为你必须在任何地方都提交。如果可能的话,我希望只有一个提交(除非我有多个工作单元事务)
那么我为什么不把它放在最后这样的地方
public bool IsSomething()
{
try
{
unitOfWork.BeginTransaction();
var myGetStuff = repo.GetStuff(1);
if(myGetStuff == null)
{
return false;
}
var somethingElse = myGetStuff.GetSomethingElse();
if(somethngElse == null)
{
return false;
}
return true;
}
catch(Exception ex)
{
unitOfWork.RollBack();
}
finally
{
unitOfWork.Commit();
}
}
我喜欢这个,但后来我意识到如果提交失败会发生什么?它不会回滚,也不会捕获异常。
那么其他人有什么想法吗?
【问题讨论】:
-
您是只阅读还是同时更新/插入?
-
取决于方法,有些可能混合了读取/更新/插入,或者有些可能只是读取。
标签: c# .net nhibernate unit-of-work