存储库模式和许多级联更改

时间:2011-12-11 18:24:38

标签: design-patterns

我需要在更新实体时级联许多更改。我可以像下面那样做,但那是丑陋的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 个答案:

答案 0 :(得分:1)

这不属于存储库。级联更改应由某种协调所有更改的工厂或服务类进行管理。

保持您的存储库仅与检索和保存数据有关,而不是维护数据完整性。这些应该是域代码中的业务规则,而不是存储库实现。

相关问题