Injector

Python dependency injection framework, inspired by Guice.

Integration

The injector library is a dependency injection framework for python.

You define dependencies of a project as a series of modules and use them to create an Injector instance. Banshee can use this instance to manage dependencies in a handler factory.

Installation

The following CLI command will add the python dependencies to your project.

poetry add banshee[injector]

Example

import banshee
import banshee.extra.injector
import injector

...

class MyModule(injector.Module):
    @injector.singleton
    @injector.provider
    def provide_bus(self, container: injector.Injector) -> banshee.Bus:
        return (
            banshee.Builder()
            .with_middleware(container.get(banshee.IdentityMiddleware))
            .with_middleware(container.get(banshee.CausationMiddleware))
            .with_middleware(container.get(banshee.HandleAfterMiddleware))
            .with_locator(container.get(banshee.HandlerLocator))
            .with_factory(container.get(banshee.HandlerFactory))
            .build()
        )

registry = banshee.Registry()

...

container = injector.Injector((
    banshee.extra.injector.BansheeModule(registry),
    MyModule(),
))

bus = container.get(banshee.Bus)
bus.handle(SomeCommand())

Reference

class banshee.extra.injector.BansheeModule(registry=None)

Bases: Module

Banshee module.

A module to configure default bindings for various banshee related classes.

This module will configure a Bus instance with sensible defaults for local use.

Parameters

registry (Registry | None) – optional registry to bind

Return type

None

configure(binder)

Override to configure bindings.

Parameters

binder (Binder) –

Return type

None

class banshee.extra.injector.InjectorHandlerFactory(container)

Bases: HandlerFactory

Injector handler factory.

This factory will use a pre-configured dependency injection container from the injector module to instantiate handlers.

References are assumed to be functions where the first positional argument of the function is the request, or classes who provide a __call__ method, taking a single positional argument.

Dependencies will be automatically added to the handler, before calling, and can even insert the Bus for recursive calls.

Parameters

container (Injector) –