Spring - czy używanie serwisu w innym serwisie to prawdidłowy sposób?

0

Posiadam przykładowe dwa serwisy

private AuthorizationService authorizationService;
private SecurityService securityService;

których używam do procesu logowania(tworzenie ciasteczek itd.). Kontroler, który za to odpowiada to

@GetMapping("/signInSuccessfully")
    public ModelAndView signInSuccessfully(HttpServletRequest request) {
        if(authorizationService.isLoginProcess(request)) {
            authorizationService.login();
        }
 
        return new ModelAndView("redirect:/");
    }

który wykorzystuje jeden z powyższych serwisów.

Natomiast w serwisie

AuthorizationService

niektóre metody korzystają z innego serwisu

@Service
public class AuthorizationServiceImpl implements AuthorizationService {
 
    private SecurityService securityService;
 
    @Autowired
    public AuthorizationServiceImpl(SecurityService service) {
        this.securityService = service;
    }
 
    @Override
    public boolean isLoginProcess(HttpServletRequest request) {
        return true;
    }
 
    @Override
    public boolean login() {
        String username = securityService.getUsername();
 
        System.out.println(username);
 
        return false;
    }
}

i tu pojawia się ten mój problem. Czy jest to prawidłowy sposób na używanie serwisu, czy może nie powinienem zawiązywać innych serwisów w serwisie, a przekazywać tylko bezpośrednio z kontrolera parametry do metody, czyli np. zmiana kontrolera na

@GetMapping("/signInSuccessfully")
    public ModelAndView signInSuccessfully(HttpServletRequest request) {
        if(authorizationService.isLoginProcess(request)) {
            authorizationService.login(securityService.getUsername());
        }
 
        return new ModelAndView("redirect:/");
    }

i

@Service
public class AuthorizationServiceImpl implements AuthorizationService {
 
    @Override
    public boolean isLoginProcess(HttpServletRequest request) {
        return true;
    }
 
    @Override
    public boolean login(String username) {
        System.out.println(username);
 
        return false;
    }
}

Wtedy w serwisie nie ma żadnego innego serwisu i jest zachowana zasada SOLID. Jak uważacie?

1

I jedno i drugie rozwiązanie jest ok i ma sens w różnych sytuacjach. Czasem np nie chcesz wstrzykiwać sobie miliona serwisów w jedno miejsce więc je "opakowujesz" w jakiś bardziej zbiorczy. Nie ma to nic wspólnego z łamaniem zasady SOLID. Ba, jeśli juz to łamiesz ją co najwyżej w tej drugiej sytuacji bo nagle kontroler robi dużo wiecej niż powinien.

0

Nie bardzo widzę różnicę w poprawności między obiema wersjami.
W obu jest łamana zasada która mówi że klasy webowe nie powinny wyciekać do warstwy serwisowej.
A ten SecurityService skąd ma znać userName, skoro nie przekazujesz mu nic?

0

W obu jest łamana zasada która mówi że klasy webowe nie powinny wyciekać do warstwy serwisowej.

@vpiotr nie no bez przesady, GDZIEŚ musisz powiązać kontroler z warstwą logiki więc ta druga opcja jest ok. Masz jakiś AuthorizationController i on jest powiązany z AuthorizationService i kontroler mapuje endpointy na wywołania metod z warstwy logiki. Gdzie tu jakieś wyciekanie? Co innego w tej pierwszej wersji, o czym wspomniałem wyżej -> tam faktycznie widać ze ktoś logikę przeniósł do kontrolera, co jest błędem.

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