我正在为存储库构建一组CRUD屏幕。成员对象足够大,我不想一次将大量内容加载到内存中 - 就像生成搜索结果一样。
由于搜索结果需要的是几个属性 - 例如“name”和“id” - 我可以只查询底层数据库 - 但我不想绕过存储库,因为这会否定其很多价值。
我发现的存储库模式介绍和教程不包括这种情况。他们专注于一次保存/检索/删除一个完全填充的对象。
我熟悉延迟加载对象的代理模式。但大男孩是怎么做到的呢?这个问题有一个完善的解决方案吗?
答案 0 :(得分:1)
如果你严格遵守DDD,我认为你的搜索应该返回完全填充的对象。但有时你必须改变规则。
我可以告诉你不该做什么:
不仅检索所需的数据,仍然返回实体类的未完全填充的实例。这很容易变成灾难。您最终会得到不同的查询方法,这些方法似乎会返回完全填充的实体 - 但实际上它将取决于所调用的查询方法。期待混乱。
不要滚动自己的延迟初始化方案。这很困难且容易出错。我曾经这样做了一次,我可以肯定地说这不值得付出努力。
那么,剩下的是什么?我的投票是获取您需要的数据,并创建一个只包含您计划填充的字段的类,并返回这些字段的列表。现在,任何调用您的搜索功能的人都知道他们到底得到了什么:实际数据的一个子集。当您需要完整实体时,您将不得不再次访问数据库。
这是我在Java中的意思的一个例子:
public class CakeRepository {
public List<CakeProjection> getCakesByManufacturer(String manufacturer);
public Cake getCake(long id);
...
}
public class CakeProjection {
private long id;
private String cakeName;
...
}
答案 1 :(得分:0)
您可以在存储库界面上定义查询,从而撤回您之后的数据。
我认为大男孩们使用ORM层(比如Hibernate),然后将定义的查询传递给ORM。