Couche des services

Utiliser un @Service sous Spring

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Pendant la découverte des repositories et des transactions on a constaté la présence de l'implémentation des services (PenaltyServiceImpl, BookLangServiceImpl). A quoi sert la couche service dans Spring ?

Tout d'abord, elle permet de séparer clairement les opérations effectuées par le contrôleur et celles qui concernent le modèle des données (la logique business de l'application). Toute action devrait donc passer par cette couche.

Contrairement à Data Access Object (DAO), les services permettent d'implémenter les règles liées à des données. Il peut s'agir, par exemple, des vérifications associées à l'accès à des certaines ressources à travers les services.

Ensuite, si l'on ne centralise pas toute la logique, on risque la duplication du code. Cela provoquera tôt ou tard les problèmes liés à la maintenabilité et l'évolutivité de l'application.

Il est important de s'assurer de la granularité du service. Cela veut dire qu'il faut grouper les actions effectuées sur une entité donnée par service. Si l'on reprend l'exemple de notre entité Subscriber, on devrait placer toutes les activités liées à elle dans SubscriberService. Ce dernier va donc gérer de telles opérations que la gestion du compte, des relances. Voici l'interface l'illustrant :

public interface SubscriberService {
    public Subscriber getById(long id);
    public Subscriber save(Subscriber subscriber) throws Exception;
    public Subscriber confirm(Subscriber subscriber);
    public Subscriber findNonConfirmedById(long id);
    public Subscriber loadByUsername(String login);
    public Subscriber addAvatar(Subscriber subscriber) throws Exception;
    public void updateEmail(Subscriber subscriber) throws Exception;
    public void updatePassword(Subscriber subscriber) throws Exception;
    public void revive(int days);
    public BigDecimal getSpentMoney(Subscriber subscriber, boolean withPenalties);
    public int getActivityPoints(Subscriber subscriber, BigDecimal debt);
}

Cette couche est aussi un endroit qui permet de regrouper toutes les actions définies dans les repositories et de les exécuter avec l'aide des transactions.

Pour faciliter la portabilité de l'application, cette couche est donc développée selon la pratique de l'interface-driven design. Elle consiste à définir les interfaces dont les implémentations sont utilisées dans les contrôleurs. La définition des interfaces et de leurs implémentations se fait dans un fichier de configuration XML :

    <context:annotation-config/>
    <context:component-scan base-package="library.service.impl"/>  

Cette configuration active la détermination des services via l'annotation @Service. La deuxième balise indique dans quel package sont localisées les implémentations des interfaces.

Bartosz KONIECZNY Couche des données

Une question ? Une remarque ?

*

*

Un conseil JavaScript

Comment supprimer un élément du tableau JavaScript ?

PHP a sa méthode unset() pour supprimer un élément du tableau. JavaScript n'est guère plus compliqué. Pour supprimer n'importe quel élément il suffit d'utiliser l'opérateur delete :

delete myArray[key];
On peut également utiliser la méthode pop() qui va automatiquement supprimer le dernier élément de notre Array(). On peut également enlever le premier élément du tableau en utilisant shift().