我需要在更新实体时级联许多更改。我可以像下面那样做,但那是丑陋的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();
}
答案 0 :(得分:1)
这不属于存储库。级联更改应由某种协调所有更改的工厂或服务类进行管理。
保持您的存储库仅与检索和保存数据有关,而不是维护数据完整性。这些应该是域代码中的业务规则,而不是存储库实现。