我已经阅读了很多关于这些东西的内容,目前我正在开发一个更大的 Web 应用程序及其相应的后端。
但是,我从一个设计开始,我要求存储库从数据库中获取数据并将其映射到 DTO。为什么选择 DTO?仅仅是因为直到现在基本上一切都是简单的东西,没有更多的复杂性是必要的。如果它变得更复杂一点,那么我开始直接在服务层中映射例如 1 对 n 关系。就像是:
// This is Service-Layer
public List<CarDTO> getCarsFromOwner(Long carOwnerId) {
// Entering Repository-Layer
List<CarDTO> cars = this.carRepository = this.carRepository.getCars(carOwnerId);
Map<Long, List<WheelDTO>> wheelMap = this.wheelRepository.getWheels(carId);
for(CarDTO car : cars) {
List<WheelDTO> wheels = wheelMap.get(car.getId());
car.setWheels(wheels);
}
return cars;
}
这当然可行,但事实证明,有时事情会变得比这更复杂,我开始意识到如果我对此不做任何事情,代码可能看起来很丑陋。
当然,我可以wheelMap
在. CarRepository
_cars
wheels
getCars(Long ownerId)
我显然缺少业务层,对吧?但我根本无法理解它的最佳实践。
假设我有Car
一个Owner
业务对象。我的代码会是这样的吗:
// This is Service-Layer
public List<CarDTO> getCarsFromOwner(Long carOwnerId) {
// The new Business-Layer
CarOwner carOwner = new CarOwner(carOwnerId);
List<Car> cars = carOwner.getAllCars();
return cars;
}
这看起来很简单,但内部会发生什么?问题特别针对CarOwner#getAllCars()
.
我想这个函数将使用 Mappers 和 Repositories 来加载数据,并且特别是关系映射部分得到处理:
List<CarDTO> cars = this.carRepository = this.carRepository.getCars(carOwnerId);
Map<Long, List<WheelDTO>> wheelMap = this.wheelRepository.getWheels(carId);
for(CarDTO car : cars) {
List<WheelDTO> wheels = wheelMap.get(car.getId());
car.setWheels(wheels);
}
但是怎么做?是CarMapper
提供功能getAllCarsWithWheels()
和getAllCarsWithoutWheels()
?这也会将CarRepository
和WheelRepository
移入CarMapper
,但这是存储库的正确位置吗?
如果有人可以向我展示上面代码的一个很好的实际示例,我会很高兴。
附加信息
我没有使用 ORM——而是使用 jOOQ。它本质上只是一种编写 SQL 的类型安全的方式(顺便说一句,使用它很有趣)。
这是一个示例:
public List<CompanyDTO> getCompanies(Long adminId) {
LOGGER.debug("Loading companies for user ..");
Table<?> companyEmployee = this.ctx.select(COMPANY_EMPLOYEE.COMPANY_ID)
.from(COMPANY_EMPLOYEE)
.where(COMPANY_EMPLOYEE.ADMIN_ID.eq(adminId))
.asTable("companyEmployee");
List<CompanyDTO> fetchInto = this.ctx.select(COMPANY.ID, COMPANY.NAME)
.from(COMPANY)
.join(companyEmployee)
.on(companyEmployee.field(COMPANY_EMPLOYEE.COMPANY_ID).eq(COMPANY.ID))
.fetchInto(CompanyDTO.class);
return fetchInto;
}