Dependency Injector
? Dependency Injector
é uma estrutura de injeção de dependência para Python.
Ajuda a implementar o princípio de injeção de dependência.
Principais recursos do Dependency Injector
:
Factory
, Singleton
, Callable
, Coroutine
, Object
, List
, Dict
, Configuration
, Resource
, Dependency
e Selector
que ajudam a montar seus objetos. Consulte Provedores.yaml
, ini
e json
, configurações pydantic
, variáveis de ambiente e dicionários. Consulte Provedor de configuração.mypy
. Consulte Digitação e mypy.Cython
. from dependency_injector import containers , providers
from dependency_injector . wiring import Provide , inject
class Container ( containers . DeclarativeContainer ):
config = providers . Configuration ()
api_client = providers . Singleton (
ApiClient ,
api_key = config . api_key ,
timeout = config . timeout ,
)
service = providers . Factory (
Service ,
api_client = api_client ,
)
@ inject
def main ( service : Service = Provide [ Container . service ]) -> None :
...
if __name__ == "__main__" :
container = Container ()
container . config . api_key . from_env ( "API_KEY" , required = True )
container . config . timeout . from_env ( "TIMEOUT" , as_ = int , default = 5 )
container . wire ( modules = [ __name__ ])
main () # <-- dependency is injected automatically
with container . api_client . override ( mock . Mock ()):
main () # <-- overridden dependency is injected automatically
Quando você chama a função main()
a dependência Service
é montada e injetada automaticamente.
Ao fazer testes, você chama o método container.api_client.override()
para substituir o cliente API real por uma simulação. Quando você chama main()
, a simulação é injetada.
Você pode substituir qualquer provedor por outro provedor.
Também ajuda na reconfiguração do projeto para diferentes ambientes: substitua um cliente API por um stub no dev ou estágio.
Com o Dependency Injector
, a montagem do objeto é consolidada em um container. As injeções de dependência são definidas explicitamente. Isso torna mais fácil entender e alterar o funcionamento de um aplicativo.
Visite a documentação para saber mais sobre injeção de dependência e inversão de controle em Python.
O pacote está disponível no PyPi:
pip instalar injetor de dependência
A documentação está disponível aqui.
Escolha um dos seguintes:
Escolha um dos seguintes:
A estrutura segue o princípio PEP20 (The Zen of Python):
Explicit is better than implicit
Você precisa especificar como montar e onde injetar explicitamente as dependências.
O poder da estrutura está em sua simplicidade. Dependency Injector
é uma ferramenta simples para um conceito poderoso.
Dependency Injector
no GithubDependency Injector
Dependency Injector
develop