我正在构建基于存储库模式的 ORM。在存储库中,我创建了一些我称之为“数据源”的东西来从数据库中获取结果并将它们映射到实体对象。每个数据源都是使用查询创建的,负责获取第一行的单个结果或所有结果。虽然数据源主要负责从(准备好的)查询中获取单个或所有对象,但它也可以作为在创建数据源期间设置的“游标”的代理。我将光标放在引号中,因为它实际上是一个主键数组,稍后用于使用这些 ID 从存储库中获取实体。这种类似游标的实现是由于 SQLite 在这种情况下在游标方面没有提供更好的东西。
所以数据源提供了singleEntity()、allEntities()、firstEntity()、nextEntity()、previousEntity()、entityAtIndex()。如前所述,除了前两个之外,所有这些实际上都在使用光标。游标是从与数据源相同的查询创建的(但自动优化以限制游标的选定字段)。
存储库本身提供 CRUD 功能(getById()、remove()、create()、update())。
这可能一切都很好,其中大部分只是常见的模式实现......但刚才我意识到以下问题:
即使存储库本身应该用于按 ID 获取实体,存储库中的数据源可能只是对数据使用不同的投影 - 或者只是可用的子集。因此,它可能会返回与默认存储库 getEntityById() 将返回的内容不同的或只是一些替代映射。
应该如何改变设计?1) 不允许默认 repo getter 以外的其他映射?=> 可能是糟糕的设计。如何控制对数据源等的查询。 2) 强制用户为光标设置自定义查询以创建索引 + 提取器查询以按 id 获取单个结果?=> 比以前的想法更好,但也意味着可能出现不一致的地方,以防游标提取器的设置与数据源结果映射不同。3)希望我还没有想到的东西。我仍然可以轻松地重新设计完整的 API