更新实体时,我需要层叠许多更改。 我可以像下面那样做,但是那真是丑陋的恕我直言(已经有太多参数在计数了)。

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

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

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

  ask by Mika Kolari translate from so

未解决问题?本站智能推荐:

2回复

单个表和存储库模式中的许多实体

我在数据库中存储媒体,例如。 电影,系列(季节,剧集),音乐(组,专辑,曲目)。 所有这些数据都存储在单个表(媒体)中。 问题:如何在代码中使用此表? 我有两个选择: 为所有媒体类型创建一个存储库和一个大型模型。 为每种媒体类型创建模型和存储库。 哪个更好?为什
2回复

存储库模式-构建存储库

我试图在我的MVC程序设计中使用存储库,但遇到了如何最好地构造存储库的问题。 例如,假设我有一个对象USers,并且我有一个UserRepository,它具有诸如getUser(int id) , saveUser(Dal.User model)等功能。 因此,如果在我的控制器中我
4回复

一个大的存储库与许多小存储库?

我的数据库中有几个产品表: ProductTypes 产品类别 ProductCategoryItems ProductInventory 我现在看到它的方式,我可以制作具有以下方法的IProduct: FindAllTypes() F
5回复

存储库模式实现

似乎我找到了存储库模式的每个例子,实现在某种程度上是不同的。 以下是我主要找到的两个例子。 然后通常有另一层与存储库通信并调用FindAll()方法并执行任何操作,例如查找以字母's'开头的产品或获取特定类别中的产品。 另一个例子我发现很多将所有的find方法都放入了存储库
3回复

DI和存储库模式

目前,我的代码与此类似(缩短只是为了说明一点): DAL 存储库接口 基本EF存储库 基本存储库的示例实现 BLL 现在,一切都很好。 我可以简单地做这样的事情: 当我阅读这篇博文时,混乱开始,作者说使用如下代码: 是一种糟糕的技术,
1回复

存储库模式论坛

根据Martin Fowler的说法: ...“客户端对象以声明方式构造查询规范并将其提交到存储库以满足”... 为什么? 那时有什么优势? 我看到一个缺点:数据库查询在关系上传播和隐藏。 这使得调试变得更加困难。
1回复

Laravel上的存储库模式

我想使用Repository Pattern但我坚持语法。 我想得到我的函数index()。 第一步,我创建文件夹Repositories然后创建文件AuteurRepository.php 在我的文件AuteurController中我有这个: 在我的模型中,我只有
1回复

Laravel 5的存储库模式

我在app / Repositories中创建了一些Repositories类,如SeriesRepository , CommentRepository等。我这样做的想法是抽象数据库调用,所以我可以使用Eloquent或查询构建器甚至原始SQL,如果我愿意,而不必更改查询在代码中的数千个地方。
4回复

存储库模式问题

我首先为我的每个实体创建了一个新的存储库接口,例如IClientRepository。 然后我为每个实体创建了一个类,例如SqlClientRepository。 我为很多实体做了这个,然后意识到他们都有相同的方法:添加,更新,删除,GetAll。 所以我意识到我应该只创建一个界面,而
2回复

用存储库模式查询

我有以下数据库模型: 我使用Linq-to-SQL和Design Pattern Repository来描述下面的页面http://www.remondo.net/repository-pattern-example-csharp/ 这是一个类图: 我想进行这样的查询,但改为使