Dict provider

Dict provider provides a dictionary of values.

import dataclasses
from typing import Dict

from dependency_injector import containers, providers


@dataclasses.dataclass
class Module:
    name: str


@dataclasses.dataclass
class Dispatcher:
    modules: Dict[str, Module]


class Container(containers.DeclarativeContainer):

    dispatcher_factory = providers.Factory(
        Dispatcher,
        modules=providers.Dict(
            module1=providers.Factory(Module, name="m1"),
            module2=providers.Factory(Module, name="m2"),
        ),
    )


if __name__ == "__main__":
    container = Container()

    dispatcher = container.dispatcher_factory()

    assert isinstance(dispatcher.modules, dict)
    assert dispatcher.modules["module1"].name == "m1"
    assert dispatcher.modules["module2"].name == "m2"

    # Call "dispatcher = container.dispatcher_factory()" is equivalent to:
    # dispatcher = Dispatcher(
    #     modules={
    #         "module1": Module(name="m1"),
    #         "module2": Module(name="m2"),
    #     },
    # )

Dict provider handles keyword arguments the same way as a Factory provider.

To use non-string keys or keys with . and - provide a dictionary as a positional argument:

providers.Dict({
    SomeClass: providers.Factory(...),
    "key.with.periods": providers.Factory(...),
    "key-with-dashes": providers.Factory(...),
})

Example:

import dataclasses
from typing import Dict

from dependency_injector import containers, providers


class Command:
    ...


class CommandA(Command):
    ...


class CommandB(Command):
    ...


class Handler:
    ...


class HandlerA(Handler):
    ...


class HandlerB(Handler):
    ...


@dataclasses.dataclass
class Dispatcher:
    command_handlers: Dict[Command, Handler]


class Container(containers.DeclarativeContainer):

    dispatcher_factory = providers.Factory(
        Dispatcher,
        command_handlers=providers.Dict({
            CommandA: providers.Factory(HandlerA),
            CommandB: providers.Factory(HandlerB),
        }),
    )


if __name__ == "__main__":
    container = Container()

    dispatcher = container.dispatcher_factory()

    assert isinstance(dispatcher.command_handlers, dict)
    assert isinstance(dispatcher.command_handlers[CommandA], HandlerA)
    assert isinstance(dispatcher.command_handlers[CommandB], HandlerB)

    # Call "dispatcher = container.dispatcher_factory()" is equivalent to:
    # dispatcher = Dispatcher(
    #     command_handlers={
    #         CommandA: HandlerA(),
    #         CommandB: HandlerB(),
    #     },
    # )