Dependency providerΒΆ

Dependency provider is a placeholder for the dependency of the specified type.

The first argument of the Dependency provider specifies a type of the dependency. It is called instance_of. Dependency provider controls the type of the returned object to be an instance of the instance_of type.

The Dependency provider must be overridden before usage. It can be overridden by any type of the provider. The only rule is that overriding provider must return an instance of instance_of dependency type.

import abc
import dataclasses

from dependency_injector import containers, providers, errors


class DbAdapter(metaclass=abc.ABCMeta):
    ...


class SqliteDbAdapter(DbAdapter):
    ...


class PostgresDbAdapter(DbAdapter):
    ...


@dataclasses.dataclass
class UserService:
    database: DbAdapter


class Container(containers.DeclarativeContainer):

    database = providers.Dependency(instance_of=DbAdapter)

    user_service = providers.Factory(
        UserService,
        database=database,
    )


if __name__ == '__main__':
    container1 = Container(database=providers.Singleton(SqliteDbAdapter))
    container2 = Container(database=providers.Singleton(PostgresDbAdapter))

    assert isinstance(container1.user_service().database, SqliteDbAdapter)
    assert isinstance(container2.user_service().database, PostgresDbAdapter)

    container3 = Container(database=providers.Singleton(object))
    try:
        container3.user_service()
    except errors.Error as exception:
        print(exception)
        # The output is:
        # <object object at 0x107ce5c40> is not an
        # instance of <class '__main__.DbAdapter'>