Appliquer les principes de l'unité de travail dans Apex
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Décrire la classe Unité de travail et ses méthodes.
- Utiliser la classe fflib_SObjectUnitOfWork et son API dans Apex.
Vidéo de démonstration Trail Together
Vous souhaitez être guidé pas à pas par un expert pendant que vous travaillez sur cette étape ? Regardez cette vidéo qui fait partie de la série Trail Together.
(Ce clip commence à 1 h 08 min 31 s, au cas où vous voudriez revenir en arrière et regarder à nouveau le début de l’étape.)
Petit échauffement avec l’Unité de travail
Comme il s'agit d'un contenu avancé, il est logique d'envisager un scénario plus complexe : la création d'une opportunité et de tous les enregistrements dépendants requis à partir de zéro, ce qui, très étonnamment, représente beaucoup de travail. Le code de configuration de test suivant montre comment cela pourrait être réalisé sans l'unité de travail. Mais c’est plutôt verbeux, non ?
Recréons le code ci-dessus à l'aide du modèle Unité de travail. Pour commencer, créons une instance Unité de travail. N'oubliez pas que les objets transmis au constructeur doivent être en ordre de dépendance pour que la méthode commitWork puisse les insérer dans l'ordre correct.
Dans l'unité précédente, la méthode de service applyDiscount utilisait la méthode registerDirty pour enregistrer les enregistrements Opportunité et Ligne d'opportunité. La méthode registerNew insère de nouveaux enregistrements. Lors de l'insertion d'enregistrements enfants, cette méthode assure également que l'ID parent approprié est appliqué avant d'insérer les enregistrements enfants. Vous pouvez le voir en action à la ligne 22. Si vous avez d'autres relations à établir, vous pouvez également appeler la méthode registerRelationship (ligne 21). Maintenant, mettons notre Unité de travail au travail ! Admirez le jeu de mots.
Comme pour l'unité précédente, ces méthodes n'accomplissent pas d'opérations de base de données. Pour ce faire, vous devez valider le travail à l’aide de la méthode commitWork, qui appelle les instructions DML correctes avec des enregistrements qui ont été enregistrés dans l'ordre approprié : enfant, puis parent. En outre, pour les relations, elle attribue l'ID du parent dans les enregistrements enfants, et compose votre modèle d'objet lorsqu'il est inséré dans la base de données.
Vous noterez que le code est non seulement plus court, mais également que sa logique est beaucoup plus lisible, sans toutes ces listes agaçantes ! Voici davantage d'exemples des méthodes d’enregistrement que vous pouvez utiliser.
Récapitulatif
Dans ce module, vous avez appris pourquoi il est intéressant d’envisager l’implémentation de votre application en couches ayant chacune ses propres considérations et préoccupations. Tout comme dans un organisme, chacune joue un rôle pour rendre votre application plus robuste et durable.
Vous avez fait le premier pas sur ce chemin en isolant l'essence de votre application, sa logique métier. Vous pouvez vous arrêter ici ou continuer et appliquer la séparation des préoccupations au comportement des objets (code de déclenchement) et à la demande des informations dont votre application a besoin. N’oubliez pas de consulter le module Apex Enterprise Patterns : Couches Domaine et Sélecteur, qui présente plus en détail les couches d’application Domaine et Sélecteur. Dans l'intervalle, amusez-vous à développer vos services !
Préparation aux défis
Pour réussir ces défis, vous devez déployer certaines bibliothèques open source. La classe fflib_SObjectUnitOfWork
fait partie de la bibliothèque open source Apex Common qui dépend de la bibliothèque open source ApexMocks Framework. Vous devez d'abord installer ApexMocks, puis Apex Commons. Vous pouvez en apprendre plus sur ces bibliothèques et leurs contrats de licence open source respectifs dans leurs dépôts.
Pour installer les bibliothèques dans votre organisation, il vous suffit d'utiliser les boutons « Déployer » ci-dessous.
Déployer la bibliothèque open source ApexMocks.
Déployer la bibliothèque open source Apex Common.
Ressources
- Séparation des préoccupations (Wikipédia)
- Modèles d’architecture d’entreprise de Martin Fowler
- Modèles d’unités de travail de Martin Fowler
- Apex Enterprise Patterns - Dépôt GitHub
- Gestion de votre DML et de vos transactions avec une unité de travail
- En faire plus avec l’unité de travail