Exemple pratique d'architecture hexagonale en Python

J'ai récemment écrit un backend basé sur l'architecture hexagonale en interne et cela fonctionne plutôt bien (je vais le faire), donc je vais essayer d'écrire l'essence de base très facilement.

Exemple d'implémentation TagService

Couche de domaine


from zope.interface import Interface
from .base import Entity, ValueObject

class Post(Entity):
    u""" Post Model """
    ...
    
class Tag(ValueObject):
    u""" Tag Model """    
    ...

class ITagService(Interface):    # specification
    u""" Tag management domain service """
    def add_tag(post, tag):
        u""" add tag to a post """

    def remove_tag(post, tag):
        u""" remove tag from a post """

Veuillez vous référer aux articles suivants pour ValueObject et zope.interface.

Couche d'infrastructure

from zope.interface import implementer
from .domain.model import ITagService

@implementer(ITagService)    # implement TagService as described in ITagService
class TagService(object):
    u""" TagService using xxx """
    def add_tag(self, post, tag):
        u""" add tag to a post """
        # do some actual staff

    def remove_tag(self, post, tag):
        u""" remove tag from a post """
        # do some actual staff


@implementer(ITagService)
class DummyTagService(object):      # i.e. memory based implementation
    u""" TagService for tests """
    def add_tag(self, post, tag):
        u""" add tag to a post """
        # do some actual staff

    def remove_tag(self, post, tag):
        u""" remove tag from a post """
        # do some actual staff

Couche d'application

from .infrastructure import TagService

def add_tag(post, tag):
    srv = TagService()
    srv.add_tag(post, tag)    # use TagService as described in ITagService

tester

À propos du rôle de la couche de domaine

On m'a demandé en interne: «Avez-vous besoin d'ITagService?», Mais je pense que le rôle de la couche domaine est de présenter des «spécifications» à chacune des couches application et infrastructure. .. Avec la couche de domaine, la couche d'infrastructure peut être implémentée pour fournir cette interface, et la couche d'application peut utiliser le modèle en fonction de cette interface.

Si vous le comparez à la spécification ECMAScript,

En interposant la couche de domaine, le fournisseur de fonctions et l'utilisateur peuvent bénéficier l'un de l'autre.

Recommended Posts

Exemple pratique d'architecture hexagonale en Python
Jugement d'équivalence d'objet en Python
Reproduire l'exemple d'exécution du chapitre 4 de Hajipata en Python
Implémentation du tri rapide en Python
Reproduire l'exemple d'exécution du chapitre 5 de Hajipata en Python
Manipulation des pixels d'image en Python
Diviser timedelta dans la série Python 2.7
Échappement automatique des paramètres MySQL en python
Gestion des fichiers JSON en Python
Affichage de la forme d'onde audio en Python
Implémentation du tri original en Python
Brouillage réversible d'entiers en Python
[Python] PCA scratch dans l'exemple de "Introduction à la méthode d'analyse multivariée"
Conversion de la chaîne <-> date (date, datetime) en Python
Pratique d'utilisation de ceci en Python (mauvais)
Théorie générale de la relativité en Python: Introduction
Arborescence de sortie des fichiers en Python
Afficher une liste d'alphabets en Python 3
Comparaison des modules de conversion japonais en Python3
Résumé de diverses instructions for en Python
Exemple d'analyse de squelette tridimensionnelle par Python
Le résultat de l'installation de python sur Anaconda
Modèles Gang of Four (GoF) en Python
Principes de base pour exécuter NoxPlayer en Python
Remplacement en bloc des chaînes dans les tableaux Python
Projet Euler # 16 "Somme des pouvoirs" en Python
Traffic Safety-kun: Reconnaissance des panneaux de signalisation en Python
Résumé des méthodes intégrées, etc. de la liste Python
Utilisation d'opérateurs non logiques de ou en python
À la recherche du FizzBuzz le plus rapide en Python
Projet Euler # 17 "Nombre de caractères" en Python
Equation de mouvement à double pendule en python
Débarrassez-vous des images DICOM en Python
Statut de chaque système de traitement Python en 2020
Projet Euler # 1 "Multiple de 3 et 5" en Python
Un exemple de réponse à la question de référence de la session d'étude. Avec python.
Quadtree en Python --2
Python en optimisation
CURL en Python
Sortie du nombre de cœurs de processeur en Python
Métaprogrammation avec Python
Dessiner un graphique d'une fonction quadratique en Python
Python 3.3 avec Anaconda
SendKeys en Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Recevoir le websocket de l'API kabu station ® en Python
Exemple de prise de Python> function> * args comme argument
Résumé de la façon d'importer des fichiers dans Python 3
Projet Euler # 10 "somme des nombres premiers" en Python
Fonctionnement sans assistance des feuilles de calcul Google (etc.) en Python
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Époque en Python
Discord en Python
Copiez la liste en Python
Visualisation en temps réel des données thermographiques AMG8833 en Python
Allemand en Python