IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Architecture Discussion :

Service Layer et transactions


Sujet :

Architecture

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 57
    Points
    57
    Par défaut Service Layer et transactions
    Bonjour,

    Je viens me nourrir de vos avis

    A partir du pattern MVC, j'ai implémenté en php (avec Zend), une couche de services et d'accès aux données (DAO, mapping géré par Doctrine) avec injection de dépendances en m'inspirant de JAVA avec Spring MVC et Hibernate. Evidemment je l'ai adapté à un environnement script. Par exemple, l'injection de dépendances est totalement lazy.

    Mais ma question ne porte pas sur PHP et bien sur un problème de conception.

    J'ai besoin d'ajouter la notion de transaction à mes services. Avec JAVA et l'AOP c'est assez facile et ça passe par des fichiers de configuration, le code venant s'injecter au moment de la compilation. Dans un environnement script c'est moins évident, ce serait trop lourd.
    L'avantage de l'AOP est que les services ignorent totalement la présence d'un gestionnaire de transactions.

    Comment faire dans mon cas ? Par exemple si dans un controller je dois faire appel à deux méthodes de deux services distincts mais dont le traitement est lié, si le traitement lors de l'appel à la 2ème méthode échoue, je dois rollback ce qui s'était passé dans la 1ère.

    Essayons avec un exemple:

    J'ai un site contenant des albums photos, j'ai donc deux entités, album et photo. Lorsque je veux ajouter des photos à un album existant, en supposant que j'ai deux services, respectivement photoService et albumService, j'obtiens dans le controlleur quelquechose proche de (grossièrement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //.... validation données POST ok.
    $photoIds = $this->_photoService->addPhotos($form['photos']);
    $album = $this->_albumService->findAlbumById($form['album']);
    $this->_albumService->linkPhotosToAlbum($album, $photoIds);
    Sauf que, si le link des photos se passe mal, je dois pouvoir annuler le addPhotos.

    La seule méthode que je vois serait d'implémenter des méthodes "beginTransaction()", "commitTransaction()" et "rollbackTransaction()" dans mon service générique.
    Mais, la présence de DAO n'est pas obligatoire dans les services, qui fonctionnent exactement comme des services en JAVA avec Spring MVC, et avec ce système j'ai besoin d'un DAO générique toujours présent dans les services pour déclencher les transactions.
    Cette solution ne répond donc pas à la problématique car elle lie très fortement les services à la couche d'accès aux données (DAO).

    Seulement, à part cette solution je sèche

    Des idées ?

    Merci.

    A+ benjamin.

  2. #2
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    je ne sais pas comment faire en script/php mais le truc qu'il faut savoir c'est que l'AOP ne fait pas tout dans l'histoire.
    Il y a toujours un TransactionManager qui gère les transactions et c'est avec ce transaction manager que les ressources .......transactionnelles communiquent.
    Il te faut donc reproduire ce mécanisme.

  3. #3
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    La difficulté est de transposer le tissage des aspects dans php. Peut être qu'un proxy générique pourrait résoudre l'affaire.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 57
    Points
    57
    Par défaut
    Alors, depuis j'ai revu un peu mon archi.

    En fait, il me manquait le pattern façade (ce que vous appelez les managers en JAVA).
    Si j'ai un cas d'utilisation qui nécessite pour une même transaction d'invoquer plusieurs service, la façade me permet d'orchestrer le tout.
    Pour ce qui est de la transaction, j'ai mis en place de l'AOP très simplifié et pour pallier au problème de performances, je génère des classes proxy au runtime mais je les écris dans des fichiers physiques. Lorsque je passe en prod, je désactive la génération des proxy et l'AOP utilise les classes dans les fichiers déjà présents.

    Tout est pour le moment expérimental, mais je suis assez satisfait du résultat

    Merci pour vos interventions.

    A+ benjamin.

  5. #5
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Bonjour à tous, apparemment comme toi Delprog je viens du Java et l'AOP est quelques chose d'assez naturel pour moi. J'ai été assez déçu des frameworks PHP/AOP existants aujourd'hui. Du coup j'ai essayé de ruser en utilisant la méthode PHP __call, je décris ma façon de faire sur mon blog : http://bgaillard.blogspot.com/2009/1...ices-zend.html, si ça peut servir à quelqu'un...

    Delprog, tu utilises quoi pour faire de l'AOP en PHP ?

    Merci,

    Baptiste

Discussions similaires

  1. Ressources, user et service layer
    Par Delprog dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 19/01/2010, 16h12
  2. (Layered Service Provider) et Oracle 8
    Par nadhmiS dans le forum Oracle
    Réponses: 0
    Dernier message: 25/11/2008, 18h01
  3. Réponses: 11
    Dernier message: 26/09/2007, 11h28
  4. Pattern Service layer
    Par roboss dans le forum Architecture
    Réponses: 9
    Dernier message: 30/03/2005, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo