[英]Repository pattern and many cascading changes
更新实体时,我需要层叠许多更改。 我可以像下面那样做,但是那真是丑陋的恕我直言(已经有太多参数在计数了)。
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();
}
这不属于存储库。 级联的更改应由某种工厂或服务类来管理,这些类可协调所有更改。
使您的存储库仅与检索和保存数据有关,而与维护数据完整性无关。 这些业务规则应该放在域代码中,而不是存储库实现中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.