DI (injection de dépendances) en Python

DI avec Python

Il ne semble pas y avoir de demande, mais il m'est arrivé de découvrir comment DI avec Python, alors ...

Plusieurs options

Inject semble avoir cessé de se développer en 2015. di-py ne semble pas très bien documenté. J'ai évité siringa parce que c'était une façon un peu perverse d'injecter des indices de type.

J'ai essayé l'injecteur avec la méthode d'élimination.

Caractéristiques de l'injecteur

Comme expliqué dans la documentation, il s'agit d'un framework semblable à Google Guice. L'explication de Google Guice était facile à comprendre dans cet article. Notes d'utilisation de Google Guice

Les termes tels que Injecter, Module et Provider sont presque les mêmes que Google Guice, il peut donc être plus facile de comprendre Guice en premier. (Bien qu'il y ait encore des indices de type, faire de la DI dans un langage de script était difficile à comprendre)

Exemple d'implémentation

DI l'instance

todo_usecase.py



@singleton
class TodoUseCase:

    def register(self, todo: Todo) - > None:
        print("call todo_usecase.register")

todo_controller.py



@singleton
class TodoController:

    @inject
    def __init__(self, todo_usecase: TodoUseCase) -> None:
        self.todo_usecase = todo_usecase

    def create_todo(self, todo: Todo) -> None:
        self.todo_usecase.register(todo)

if __name__=='__main__':
    injector = Injector()
    todo_controller: TodoController = injector.get(TodoController)

    todo: Todo = Todo()

    todo_controller.create_todo(todo)

Si vous voulez DI une instance normale, juste @ Inject fera la DI pour vous. Par défaut, il semble être singleton en ajoutant @ singleton au lieu de singleton. (Guice n'est pas non plus singleton par défaut)

DI une instance de la classe d'implémentation

todo_repository.py



class TodoRepository:

    @abstractmethod
    def register(self, todo: Todo) -> None:
        raise NotImplementedError

todo_datasource.py



class TodoDataSource(TodoRepository):

    def register(self, todo: Todo) -> None:
        print("call todo_datasource.register")

todo_usecase.py



@singleton
class TodoUseCase:

        @inject
    def __init__(self, todo_repository: TodoRepository) -> None:
        self.todo_repository = todo_repository

    def register(self, todo: Todo) -> None:
        self.todo_repository.register(todo=todo)

class TodoDIModule(Module):
    def configure(self, binder):
        binder.bind(TodoRepository, to=TodoDataSource, scope=singleton)

if __name__=='__main__':
    injector = Injector([TodoDIModule()])
    todo_use_case: TodoUseCase = injector.get(TodoUseCase)

    todo: Todo = Todo()

    todo_use_case.register(todo)

Le but est de définir DI dans la classe d'implémentation Module. Il semble que la méthode pour le rendre singleton puisse également être effectuée en spécifiant la portée avec Module.

c'est tout.

Recommended Posts

DI (injection de dépendances) en Python
injection de dll en python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
[Construction de l'environnement] Analyse des dépendances à l'aide de CaboCha avec Python 2.7
Liste triée en Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 6 en Python
Daily AtCoder # 18 en Python
Modifier les polices en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Lire DXF avec python
Daily AtCoder # 53 en Python
Séquence de touches en Python
Utilisez config.ini avec Python
Daily AtCoder # 33 en Python
Résoudre ABC168D en Python
Distribution logistique en Python
Décomposition LU en Python