我是IOC和DI的新相对论,所以我猜我在这里缺少一些高级设计原则,但我无法弄清楚如何使我的架构工作。
我有一个REST API端点,它接受两个POST数据:客户ID和类型ID。其余的api需要返回该特定客户/类型组合的一组数据。
控制器正在通过发布数据传递实体ID,并通过JPA存储库获取适当的实体。
然后构造一个数据生成器对象(将实体作为构造函数参数),并使用它来处理API的所有数据收集。
问题:因为数据生成器采用了两个动态构造函数参数,所以它不能被DI进入Controller,而是必须使用new
。但是,在数据生成器内部,我需要访问JPA存储库。访问这些存储库的唯一方法是通过DI。但是我不能DI,因为对象是new
而不是IOC容器的DI。
有没有办法设计这个以便我没有这个问题?我是否违反了有关IOC的规定?我在某处有错误的假设吗?任何建议都表示赞赏。
谢谢!
编辑:数据生成器的伪代码
public class DataGenerator {
private Customer customer;
private Type type
public DataGenerator(Customer customer, Type type) {
this.cusomter = customer;
this.type = type;
}
public generateData() {
if(customer == x && type == y) {
//JPA REPOSITORY QUERY
} else {
//DIFFERENT JPA REPOSITORY QUERY
}
}
}
答案 0 :(得分:1)
我想你可能已经在某个地方混淆了。您应该有Service
命中您的存储库,并将信息提供给控制器。一个原始设置就是这样的。
@Controller
public MyController {
@AutoWired
private DataService dataService;
@RequestMapping(value = "/", method = RequestMethod.GET)
private DataGenerator readBookmark(@PathVariable Long customerId, @PathVariable Integer typeId) {
return dataService.getData(customerId, typeId);
}
}
@Service
public class DataService {
@AutoWired
private JPARepository repository;
public DataGenerator getData(long customerId, int typeId) {
Type typeDetails = repository.getType(typeId);
Customer customerDetails = repository.getCustomer(customerId);
return new DataGenerator(customerDetails, typeDetails);
}
}