我该如何设计它?非hibernate方法中的工作单元
本文关键字:方法 hibernate 单元 工作 | 更新日期: 2023-09-27 18:11:59
我使用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语句中如果某项为空而我不希望它为空,我就退出语句。
这与嵌套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;
}
我不喜欢这种方式,因为你必须不断地在各处添加commit。如果可能的话,我希望只有一个提交(除非我有多个工作事务单元)
所以我想为什么不像这样把它放在最后呢
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();
}
}
我喜欢这样,但后来我意识到如果提交失败会发生什么?它不会回滚,也不会捕获异常。
还有人有什么想法吗?
对我来说,这段代码看起来相当有问题,特别是当有嵌套的工作单元调用时(您如何处理这些?)我要做的是在调用代码(在您使用ASP的情况下是控制器)中打开工作单元(和事务)。Net MVC)而不是IsSomething函数。它看起来像这样:
try
{
unitOfWork.BeginTransaction();
// some code
var isSomething = IsSomeThing()
}
catch(Exception ex)
{
unitOfWork.RollBack();
}
finally
{
unitOfWork.Commit();
}
IsSomething函数看起来就像这样
public bool IsSomething()
{
var myGetStuff = repo.GetStuff(1);
if(myGetStuff == null)
{
return false;
}
var somethingElse = myGetStuff.GetSomethingElse();
if(somethngElse == null)
{
return false;
}
return true;
}