DI (Dependency Injection) in Python

DI mit Python

Es scheint keine Nachfrage zu geben, aber ich habe zufällig herausgefunden, wie man mit Python DI macht, also ...

Mehrere Möglichkeiten

Inject scheint sich 2015 nicht mehr entwickelt zu haben. di-py scheint nicht sehr gut dokumentiert zu sein. Ich habe Siringa vermieden, weil es ein bisschen pervers war, Typ-Hinweise zu injizieren.

Ich habe den Injector mit der Eliminierungsmethode ausprobiert.

Merkmale des Injektors

Wie in der Dokumentation erläutert, handelt es sich um ein Google Guice ähnliches Framework. Die Erklärung von Google Guice war in diesem Artikel leicht zu verstehen. Hinweise zur Verwendung von Google Guice

Begriffe wie Inject, Module und Provider sind fast identisch mit Google Guice, sodass es möglicherweise einfacher ist, Guice zuerst zu verstehen. (Obwohl es immer noch Tipphinweise gibt, war es schwer zu verstehen, DI in einer Skriptsprache auszuführen.)

Implementierungsbeispiel

DI die Instanz

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)

Wenn Sie eine normale Instanz DI möchten, erledigt nur "@ Inject" die DI für Sie. Standardmäßig scheint es Singleton zu sein, indem anstelle von Singleton "@ singleton" hinzugefügt wird. (Guice ist standardmäßig auch kein Singleton)

DI eine Instanz der Implementierungsklasse

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)

Es geht darum, DI in der Modulimplementierungsklasse festzulegen. Es scheint, dass die Methode zum Erstellen eines Singletons auch durch Angabe des Bereichs mit Module erfolgen kann.

das ist alles.

Recommended Posts

DI (Dependency Injection) in Python
DLL-Injektion in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
[Umgebungskonstruktion] Abhängigkeitsanalyse mit CaboCha mit Python 2.7
Sortierte Liste in Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 6 in Python
Täglicher AtCoder # 18 in Python
Bearbeiten Sie Schriftarten in Python
Singleton-Muster in Python
Dateioperationen in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python
Tastenanschlag in Python
Verwenden Sie config.ini mit Python
Täglicher AtCoder # 33 in Python
Löse ABC168D in Python
Logistische Verteilung in Python
LU-Zerlegung in Python