首页 > 解决方案 > 决定批量写作的模式

问题描述

我有一个内存状态树支持我编写的自定义存储,因此我可以像访问数据库一样访问我的状态树。我添加了查找、添加、更新等。我在商店顶部构建了一系列存储库,以抽象出我的服务的任何数据访问问题。

在初始化期间,我播种了大量数据(数百万个条目)。我有一个问题,我的存储库必须处理的操作对于添加一堆单独的实体来说是昂贵的,但我的底层提供者很容易支持批量实体。

下面是一个使用存储库的服务示例

        foreach (var issue in issues)
        {
            foreach (var state in states)
            {
                TransferObject transferObject = new TransferObject();

                TransferObject.high = ...

                var stateworker = WorkerRepository.GetworkersByState(state);

                foreach (var worker in stateworker)
                {
                    var issueDetail = GenerateIssueDetails(issue, worker, transferObject, random);

                    IssueDetailsRepository.Add(issueDetail, worker, state, issue);
                }
            }
        }

这是存储库添加。

    public void Add(IssueDetail issueDetail, Worker worker, State state, Issue issue)
    {
        Store.Engine.Entities.Add(issueDetail);

        Store.Engine.AddToIndex(issue, workerIssueDetail);
        Store.Engine.AddToIndex(state, workerIssueDetail);
        Store.Engine.AddToIndex(worker, workerIssueDetail);

        var compoundIndex = new List<IHasUUID>() { state, issue };
        Store.Engine.AddToIndex(compoundIndex, workerIssueDetail);

        compoundIndex = new List<IHasUUID>() { worker, issue };
        Store.Engine.AddToIndex(compoundIndex, workerIssueDetail);

    }

特别是在初始化期间每次循环迭代更新我的索引的成本是痛苦的。直到以后我才需要这些数据,所以我很想用 AddToIndex 已经支持的数据范围创建每个索引。

感觉向我的存储库添加批量操作是一个错误,因为我必须使其成为有状态的(因为我在循环时一一添加)。我也不想创建一个内联有状态的持有者并将其传递到存储库中。是否有一个很好的模式可以遵循如何在我的存储库到达它之前聚合它的信息?我想这个想法是使用这个其他有状态的对象,它反过来会在幕后调用存储库。

我查看了装饰器,但似乎接口合同应该是相同的,我想我需要一个.Commit()或其他东西。我调查了工作单元,但有人建议我这主要是为了保证交易。对我来说感觉更接近我想要的,但我不确定

有什么模式建议吗?这是一个性能关键的应用程序。

标签: c#.netdesign-patternsrepository

解决方案


推荐阅读