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