Как я должен разработать это?Нибернатная единица работы в методе - PullRequest
0 голосов
/ 19 октября 2011

Я использую 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;
    }

Этот способ мне не нравится, так как вы должны постоянно размещать коммит.Если возможно, я бы хотел иметь только один коммит (если у меня не более одной транзакции с единицами работы)

Так что я решил, почему бы не поместить его в наконец-то, как это

  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();
       }
    }

Мне это нравится, но потом я понял, что произойдет, если фиксация не удалась?Он не будет откатываться, и исключение не будет обнаружено.

Так у кого-нибудь еще есть идеи?

1 Ответ

1 голос
/ 20 октября 2011

Этот ваш код выглядит довольно проблематично для меня, особенно когда есть вложенные вызовы единиц работы (как вы справляетесь с ними?).Я хотел бы открыть единицу работы (и транзакции) в вызывающем коде (контроллер в вашем случае при использовании 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;
}
...