资源库是DDD中的另一个重要概念,它是封装应用和资源库交互的模式。客户端代码通过它能够像获取内存中的领域模型一样获取持久化的领域模型。SnackMachine资源库是像这种形式的:
package com.lugew.springbootddd;
import org.springframework.data.repository.CrudRepository;
/**
* @author 夏露桂
* @since 2021/6/15 10:50
*/
public interface SnackMachineRepository extends CrudRepository<SnackMachineDto, Long> {
}
Springboot替我们实现了这个接口。
SnackMachineDto snackMachineDto = snackMachineRepository.findById(id).orElse(null);
此时有一个重要的问题,资源库的数量设置为多少合适?
- 每个聚合对应一个资源库
在我们的例子中应该有两个资源库,SnackMachineRepository和SnackRepository。
- 资源库的共有方法的返回对象只能是聚合根。
SnackMachineRepository承担了获取内部Slot的任务,这意味着当调用上述代码时,不仅能获取到SnackMachineDto本身,也能获取它内部的SlotDto——有两种实现方式:懒加载和即刻加载。同样,对于更新也是相同的。另一个注意点是资源库的共有方法的返回对象只能是聚合根。SnackMachineRepository只接受返回SnackMachine,内部实体完全隐藏。
Repository repository = new SnackMachineRepository();
SnackMachine snackMachine = repository.getBySlotId(slotId);
👆我们可以根据SlotId查找容纳它的SnackMachine。这种使用ORM的方式效率较低,追求高效率可以使用SQL脚本。