Nie używanie serwisów w innych sewisach

0

Programuję w taki sposób, aby unikać korzystania z serwisów w innych serwisach https://github.com/JonkiPro/REST-Web-Services/tree/master/core/src/main/java/com/core/jpa/service. Próbuję korzystać tylko z repozytoriów w serwisach. Obecnie piszę kontroler, który korzysta z dwóch serwisów. Jeden do zapisywania plików w chmurze, a drugi do zapisywania encji do bazy z identyfikatorem pliku w chmurze.

@PutMapping(value = "/contributions/{id}/photos")
@ResponseStatus(HttpStatus.NO_CONTENT)
public
void updatePhotoContribution(
        @PathVariable("id") final Long id,
        @RequestParam(required = false) Set<Long> elementIdsToAdd,
        @RequestPart(required = false) List<MultipartFile> elementsToAdd,
        @RequestPart(required = false) List<MultipartFile> newElementsToAdd,
        @RequestParam(required = false) Set<Long> idsToUpdate,
        @RequestPart(required = false) List<MultipartFile> elementsToUpdate,
        @RequestParam(required = false) Set<Long> idsToDelete,
        @RequestParam final Set<String> sources,
        @RequestParam(required = false) final String comment
) {
    Set<String> ids = new HashSet<>();

    for(files) {
        String id = this.storageService.save(...); // Save the file in the cloud with file identifiers stored in the cloud
        ids.add(id);
    }

    Contribution contribution = //create contribution

    try {
        this.movieContributionPersistenceService.updateReviewContribution(contribution, id, this.authorizationService.getUserId());
    } catch(ResourceNotFoundException e) {
        //  remove the file from the cloud
        throw new ResourceNotFoundException(e.getMessage());
    } catch(ResourceConflictException e) {
        //  remove the file from the cloud
        throw new ResourceConflictException(e.getMessage());
    }
}

Problem polega na tym, że cała magia z walidacją kontrybucji odbywa się w metodzie updateReviewContribution serwisu
movieContributionPersistenceService, czyli dopiero po zapisaniu plików do chmury. Dlatego w przypadku wyrzucenia jakiegoś wyjątku muszę cofnąć się tu do kontrolera i usunąć pliki, które zostały zapisane. Gdybym używał storageService w movieContributionPersistenceService można by było zrobić to lepiej, bez tego śmiesznego łapania wyjątków. Wtedy mógłbym pliki zapisywać do chmury dopiero po walidacji w klasie movieContributionPersistenceService . Co o tym myslicie?

To drugi kontroler, który wcześniej stworzyłem na tej samej zasadzie: https://pastebin.com/Ry1gcYdL (skończony)

3

Programuję w taki sposób, aby unikać korzystania z serwisów w innych serwisach

Chwila - po co i dlaczego?

0

Uważałem, że skoro te dwa serwisy są stworzone do całkiem innych zadań, to należy je odseparować. Jednak teraz widzę, że ten sposób kodowania przysparza sporo problemów, przez co kod staje się trochę zawiły. Dodatkowo kontroler, który może posiadać tylko kilka linijek, w obecnej postaci ma prawie 80. Czyli uważasz, że nie ma potrzeby bawić się w ten sposób z serwisami?

1

Mam jakiś cieżki mindfuck teraz. Wyciągnąłeś logikę z serwisów do kontrolera, żeby nie używać serwisów w serwisach? WTF? Przecież cała idea jest zupełnie odwrotna :D

0

Czyli uważasz, że nie ma potrzeby bawić się w ten sposób z serwisami?

Tak, nie ma nic złego w tym, że jeden serwis zależy od drugiego (do pewnego stopnia, patrz: low coupling & high cohesion).

Serwis jest zwyczajną klasą z wydzieloną logiką - czasem jeden fragment logiki zależy od drugiego (lub w nim się zawiera) i naturalnym wtedy jest wykorzystanie w tym celu kompozycji do łączenia serwisów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1