Мне нужно каскадировать много изменений при обновлении сущности.Я мог бы сделать это, как показано ниже, но это уродливо imho (слишком много параметров уже и подсчет).
public class PageRepository : IPageRepository
{
public void Update(Page page, string oldPath, PageState oldState, IEnumerable<Tag> oldTags /* Maybe even more stuff */)
{
using(var t = session.BeginTransaction())
{
if(/* path has changed */)
{
// move descendant pages
}
if(/* state has changed to public */)
{
// publish hidden descendant pages
}
if(/* state has changed to non-public */)
{
// hide public descendant pages
}
if(page is ITaggable)
{
foreach(var tag in ((ITaggable)page).Tags.Except(oldTags))
{
// increase tag count in ancestor pages
}
foreach(var tag in oldTags.Except(((ITaggable)page).Tags))
{
// decrease tag count in ancestor pages
}
}
// ...
session.Update(page);
t.Commit();
}
}
}
Есть ли какой-нибудь шаблон, который может помочь сделать это чище?
У меня уже естьЯ думал о разделении на несколько методов
pageRepo.BeginTransaction();
pageRepo.Update(page);
if(/* path has changed */)
{
pageRepo.MoveDescendants(page, oldPath);
}
// ...
pageRepo.Commit();
, но мне не нравится эта ручная обработка транзакций.Еще одна идея, которую я получил, это
using(var batch = pageRepo.CreateUpdateBatch(page))
{
if(/* path has changed */)
{
batch.MoveDescendants(oldPath);
}
// ...
batch.Commit();
}