Partage
  • Partager sur Facebook
  • Partager sur Twitter

soucis modélisation et interaction entre classe

SpringBoot Service / Repository

    19 avril 2021 à 19:24:44

    Salut,

    je développe une application Java avec le framework springboot et je me heurte à une soucis de conception / modélisation. Pour le moment j'ai les couches suivantes:

    • Controller (exposer une API et appeler la couche service)
    • Service (appeler un repository et transformer l'objet en DTO ou appeler un autre service pour fusionner les DTO)
    • Repository (interface JPA pour faire le CRUD)

    Sauf que maintenant certains service doive récupéré des données de plusieurs Repository et je cherche la meilleure solution:

    • passer directement par le Repository
    • passer par le Service (sauf que mes Service aujourd'hui retourne des DTOs et je trouve bizarre de retourner des DTO ou Entity) 
      • comment nommer mes méthodes pour différentier celle qui retourne un DTO ou pas ?
    Example:
    class Author {
    }
    
    class Post {
        Author author;
    
        public Author getAuthor() {
            return author;
        }
    
        public void setAuthor(Author author) {
            this.author = author;
        }
    }
    
    class AuthorDto {
    }
    
    class PostDto {
    
        String authorName;
    
        public String getAuthorName() {
            return authorName;
        }
    
    }
    
    interface AuthorMapper {
        AuthorDto toDto(Author author);
    }
    
    interface PostMapper {
        PostDto toDto(Post post);
    
        Post toEntity(PostDto post);
    }
    
    class AuthorService {
    
        private final AuthorRepository repository;
    
        private final AuthorMapper mapper;
    
        public AuthorService(AuthorRepository repository, AuthorMapper mapper) {
            this.repository = repository;
            this.mapper = mapper;
        }
    
        public AuthorDto findByName(String name) {
            return repository.findByName(name).map(mapper::toDto).get();
        }
    
    }
    
    class PostService {
    
        private final PostRepository repository;
    
        private final AuthorRepository authorRepository;
    
        private final PostMapper mapper;
    
        public PostService(PostRepository repository, AuthorRepository authorRepository, PostMapper mapper) {
            this.repository = repository;
            this.authorRepository = authorRepository;
            this.mapper = mapper;
        }
    
        public PostDto save(PostDto dto) {
            Author author = authorRepository.findByName(dto.getAuthorName()).get(); // ou passer par le service
            Post post = mapper.toEntity(dto);
            post.setAuthor(author);
            return mapper.toDto(repository.save(post));
        }
    }
    
    interface AuthorRepository {
        Optional<Author> findByName(String name);
    }
    
    interface PostRepository {
        Post save(Post post);
    }
    Merci.

    -
    Edité par K@zymir 19 avril 2021 à 19:39:41

    • Partager sur Facebook
    • Partager sur Twitter
      14 mai 2021 à 18:26:05

      Salut,

      Avec mon expérience, je te conseille de passer par les services (car il sont la pour contenir le code métier propre à ton fonctionnel) et de retourner uniquement des Entities. Ca sera à la couche controller ( ou autre ex JMS) de mettre la donnée dans le bon format en fonction de ce que tu as besoin de retourner, (via l'utilisation de JsonView par exemple)
      Et cela n'empêche en rien le fait que les services peuvent recevoir des DTO en entrée.

      J'espère avoir été compréhensible
      Code Safe,

      • Partager sur Facebook
      • Partager sur Twitter

      soucis modélisation et interaction entre classe

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown