标签: abstraction-layer

请解释存储库,映射和业务层关系和职责

我已经阅读了很多关于这些内容的内容,而且我目前正在开发一个更大的Web应用程序及其相应的后端.

但是,我开始使用一种设计,我要求Repository从数据库中获取数据并将其映射到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;
}
Run Code Online (Sandbox Code Playgroud)

这当然是有效的,但事实证明,有时事情变得比这更复杂,我开始意识到,如果我不对此做任何事情,代码可能看起来很丑陋.

当然,我可以加载wheelMap,在CarRepository那里进行轮映射,只返回完整的对象,但由于SQL查询有时看起来很复杂,我不想获取所有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> …
Run Code Online (Sandbox Code Playgroud)

business-logic dto repository-pattern abstraction-layer

10
推荐指数
1
解决办法
616
查看次数

我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?

我想在这里找到两个非常相似的问题的答案:

我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗?

要么

可以从存储库层返回DTO对象吗?

现在我被困在我的Servlet(Servie层)中,例如尝试从以下位置检索所有Restaurant对象RestaurantOwnerRepository:

// RestaurantOwnerService (Servlet)

@Override
@Transactional
public List<RestaurantDTO> getAvailableRestaurants() {

    List<Restaurant> availableRestaurants = restaurantOwnerRepository.getRestaurants(getSessionId());

    return null;
}
Run Code Online (Sandbox Code Playgroud)

这里Restaurant是一个@Entity注释的类 - 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级别的对象,它违反了在每个层中抽象数据的尝试.

如果我将每个转换Restaurant为a,那就不会是这种情况RestaurantDTO - 但是我应该这样做,这样了吗?

基本上改变:

// RestaurantOwnerRepository

@Override
public List<Restaurant> getRestaurants(String sessionId) {

    RestaurantOwner restaurantOwner = this.get(sessionId);

    // .. getting restaurants ..

    return availableRestaurants;
}
Run Code Online (Sandbox Code Playgroud)

// RestaurantOwnerRepository

@Override
public List<Restaurant> getRestaurants(String sessionId) {

    RestaurantOwner restaurantOwner = this.get(sessionId);

    // .. getting restaurants ..

    return ConvertEntity.convertRestaurants(availableRestaurants);
} …
Run Code Online (Sandbox Code Playgroud)

java gwt web-services abstraction-layer

7
推荐指数
1
解决办法
1万
查看次数

存储库与 DAO(再次)

一般来说,这个背景故事无关紧要,只是为了解释下面的代码:

服务器处理用户和用户组。用户组能够“发现”地点 - 目前这些地点完全来自 Google Places API。


当前实施


目前,我的服务层中有很多JpaRepository对象,我称之为Repository。我强调“存储库”,因为在我下面提出的解决方案中,它们将被降级为 DAO。

但是,我在当前代码中不喜欢的地方,也是我在这里提出问题的原因,是可以在UserGroupService.

@Service
public class UserGroupService {

    private final static Logger LOGGER = LogManager.getLogger(UserGroupService.class);

    @Autowired
    private UserGroupRepository userGroupRepository;

    @Autowired
    private UserGroupPlaceRepository userGroupPlaceRepository;

    @Autowired
    private PlaceRepository placeRepository;

    @Autowired
    private GooglePlaceRepository googlePlaceRepository;

    @Autowired
    private GooglePlaces googlePlaces;

    public UserGroupService() {
    }

    @Transactional
    public void discoverPlaces(Long groupId) {

        final UserGroup userGroup = this.userGroupRepository.findById(groupId).orElse(null);

        if (userGroup == null) {
            throw new EntityNotFoundException(String.format("User group with id %s not found.", …
Run Code Online (Sandbox Code Playgroud)

spring web-services server abstraction-layer

5
推荐指数
1
解决办法
5917
查看次数