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.
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.
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
from .infrastructure import TagService
def add_tag(post, tag):
srv = TagService()
srv.add_tag(post, tag) # use TagService as described in ITagService
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