Es scheint keine Nachfrage zu geben, aber ich habe zufällig herausgefunden, wie man mit Python DI macht, also ...
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.
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.)
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)
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