Package: dependency-injector2
What isDependency Injector?Dependency Injectoris a dependency injection framework for Python.It helps implement the dependency injection principle.Key features of theDependency Injector:Providers. ProvidesFactory,Singleton,Callable,Coroutine,Object,List,Dict,Configuration,Resource,Dependency, andSelectorproviders
that help assemble your objects.
SeeProviders.Overriding. Can override any provider by another provider on the fly. This helps in testing
and configuring dev/stage environment to replace API clients with stubs etc. SeeProvider overriding.Configuration. Reads configuration fromyaml,ini, andjsonfiles,pydanticsettings,
environment variables, and dictionaries.
SeeConfiguration provider.Resources. Helps with initialization and configuring of logging, event loop, thread
or process pool, etc. Can be used for per-function execution scope in tandem with wiring.
SeeResource provider.Containers. Provides declarative and dynamic containers.
SeeContainers.Wiring. Injects dependencies into functions and methods. Helps integrate with
other frameworks: Django, Flask, Aiohttp, Sanic, FastAPI, etc.
SeeWiring.Asynchronous. Supports asynchronous injections.
SeeAsynchronous injections.Typing. Provides typing stubs,mypy-friendly.
SeeTyping and mypy.Performance. Fast. Written inCython.Maturity. Mature and production-ready. Well-tested, documented, and supported.fromdependency_injectorimportcontainers,providersfromdependency_injector.wiringimportProvide,injectclassContainer(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,)@injectdefmain(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 automaticallywithcontainer.api_client.override(mock.Mock()):main()# <-- overridden dependency is injected automaticallyWhen you call themain()function theServicedependency is assembled and injected automatically.When you do testing, you call thecontainer.api_client.override()method to replace the real API
client with a mock. When you callmain(), the mock is injected.You can override any provider with another provider.It also helps you in a re-configuring project for different environments: replace an API client
with a stub on the dev or stage.With theDependency Injector, object assembling is consolidated in a container. Dependency injections are defined explicitly.
This makes it easier to understand and change how an application works.Visit the docs to know more about theDependency injection and inversion of control in Python.InstallationThe package is available on thePyPi:pip install dependency-injectorDocumentationThe documentation is availablehere.ExamplesChoose one of the following:Application example (single container)Application example (multiple containers)Decoupled packages example (multiple containers)Boto3 exampleDjango exampleFlask exampleAiohttp exampleSanic exampleFastAPI exampleFastAPI + Redis exampleFastAPI + SQLAlchemy exampleTutorialsChoose one of the following:Flask web application tutorialAiohttp REST API tutorialAsyncio monitoring daemon tutorialCLI application tutorialConceptThe framework stands on thePEP20 (The Zen of Python)principle:ExplicitisbetterthanimplicitYou need to specify how to assemble and where to inject the dependencies explicitly.The power of the framework is in its simplicity.Dependency Injectoris a simple tool for the powerful concept.Frequently asked questionsWhat is dependency injection?dependency injection is a principle that decreases coupling and increases cohesionWhy should I do the dependency injection?your code becomes more flexible, testable, and clear 😎How do I start applying the dependency injection?you start writing the code following the dependency injection principleyou register all of your application components and their dependencies in the containerwhen you need a component, you specify where to inject it or get it from the containerWhat price do I pay and what do I get?you need to explicitly specify the dependenciesit will be extra work in the beginningit will payoff as project growsHave a question?Open aGithub IssueFound a bug?Open aGithub IssueWant to help?⭐️ Star theDependency Injectoron theGithub🆕 Start a new project with theDependency Injector💬 Tell your friend about theDependency InjectorWant to contribute?🔀 Fork the project⬅️ Open a pull request to thedevelopbranch