我该如何设计它?非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();
       }
    }

我喜欢这样,但后来我意识到如果提交失败会发生什么?它不会回滚,也不会捕获异常。

还有人有什么想法吗?

我该如何设计它?非hibernate方法中的工作单元

对我来说,这段代码看起来相当有问题,特别是当有嵌套的工作单元调用时(您如何处理这些?)我要做的是在调用代码(在您使用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;
}