Pytanie odnośnie schematu projektu

Pytanie odnośnie schematu projektu
Dev007
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 163
0

Trafiłem na projekt w Springu gdzie sam projekt skadaa się projektu frontem i projektu backend ten backend jest podzielony na moduły jak frontend i backend i każdy z nich ma pod moduły. np frontent znajdują się klasy controller a w module backend serwisy, dto itp.
I teraz aby w controller wywołać metodę z jakiegoś serwisu musze utworzyć w między nimi w kilku warstwach klas i interfejsów ta metodę ( takie połączenie ). Wie ktoś w jakim jest to celu ?

RequiredNickname
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 646
1

Szukaj odpowiedzi pod poniższymi hasłami:

  1. layer architecture -> https://www.baeldung.com/cs/layered-architecture
  2. hexagona larchitecture -> https://reflectoring.io/spring-hexagonal/
  3. package per feature -> https://medium.com/sahibinden-technology/package-by-layer-vs-package-by-feature-7e89cde2ae3a

Samo pakietowanie ma za zadanie min. ustrukturyzować kod i wprowadzić porządek czy np. odseparować logikę biznesową od szczegółów technicznej implementacji. Często za pomocą np. archunit dodaje się do projektu testy weryfikujące kierunek zależności pakietów by do domeny nie wrzucać zewnętrznych zależności w postaci np. dostępu do bazy danych.

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6822
1

example-arch.drawio.png

Popatrzmy na taki prosty UML. Controller, który ma pewną specyfikację ControllerSpec, używa, ma pole, typu IService, które reprezentuje pewien interfejs. Interfejs ten jest implementowany przez klasę ServiceImpl.
I teraz mamy kilka możliwości implementacji takiego kodu.

Metoda ręczna

Tworzymy sobie obiekty i samodzielnie je łączymy:

Kopiuj

package net.programmers.frontend;

public interface ControllerSpec{
  // jakieś tam metody
}

public class Controller implemnts ControllerSpec{

   private final IService service;

   public Controller(IService service){
    this.service = service;   
   }

   //  i potem w jakiejś metodzie

   public Response get(Request req){
    //…
    service.doSomething();
    //…
   }

}

package net.programmers.backend;

public interface IService{
  // jakieś tam metody
}

public class ServiceImpl implements IService{
  // jakieś tam metody
}

package net.programmers.main;

public class App{
  public static void main(String[] args){
    IService service = new ServiceImpl();
    ControllerSpec controller = new Controller(service); 
    // i dalej coś robimy z naszym kontrolerem
  }
}

To jest akurat trochę bez sensu, bo masz dużo ręcznej roboty i musisz samodzielnie zarządzać obiektami. W dodatku, żeby sobie nie komplikować życia, wszystko jest publiczne.
Dlatego można użyć mechanizmów wstrzykiwania zależności

Kontener DI

Tutaj podam przykład z adnotacjami Springa, ale podobnie będzie w Guice i JEE

Kopiuj

package net.programmers.frontend;

public interface ControllerSpec{
  // jakieś tam metody
}

@Controller
class Controller implemnts ControllerSpec{

   private final IService service;

   @Autowire 
   public Controller(IService service){
    this.service = service;   
   }

   //  i potem w jakiejś metodzie

   public Response get(Request req){
    //…
    service.doSomething();
    //…
   }

}

package net.programmers.backend;

public interface IService{
  // jakieś tam metody
}

@Service
class ServiceImpl implements IService{
  // jakieś tam metody
}

package net.programmers.main;

public class App{
  public static void main(String[] args) {
		SpringApplication app = new SpringApplication(App.class);
		app.run(args);
	}
}

W tym przypadku za łączenie obiektów odpowiada kontener DI. Dokładny opis jak to jest zrobione znajdziesz w dokumentacji i kodzie springa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.