c# - 决定批量写作的模式
问题描述
我有一个内存状态树支持我编写的自定义存储,因此我可以像访问数据库一样访问我的状态树。我添加了查找、添加、更新等。我在商店顶部构建了一系列存储库,以抽象出我的服务的任何数据访问问题。
在初始化期间,我播种了大量数据(数百万个条目)。我有一个问题,我的存储库必须处理的操作对于添加一堆单独的实体来说是昂贵的,但我的底层提供者很容易支持批量实体。
下面是一个使用存储库的服务示例
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()
或其他东西。我调查了工作单元,但有人建议我这主要是为了保证交易。对我来说感觉更接近我想要的,但我不确定
有什么模式建议吗?这是一个性能关键的应用程序。
解决方案
推荐阅读
- python - Python:使用 join 和 lambda 的补码
- git - git revert --continue 卡住永远不会结束
- javascript - Javascript从括号内获取数据
- html - 自定义选择出现在导航菜单上方
- haskell - 我可以使用分隔符在 Haskell 中拆分列表吗?
- android - 如何解决 W/ConnectionTracker(12409) 异常:解除绑定时抛出异常
- ubuntu - Jenkins登录页面未加载
- linux - At (@) 符号在 Mac 上运行的 linux VM 上写为双角引号 («)
- flutter - Flutter BottomNavigationBar backgroundColor 被忽略
- proxy - 如何使用“httpc”库的用户名和密码设置代理?