Шаблон репозитория и множество каскадных изменений - PullRequest
0 голосов
/ 11 декабря 2011

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

1 Ответ

1 голос
/ 11 декабря 2011

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

Держите свои репозитории только для получения и сохранения данных, а не для поддержания целостности данных. Это бизнес-правила, которые должны входить в код домена, а не в реализацию репозитория.

...