aliasΒΆ

alias is used to allow retrieving of the same object by different type hints. E.g. you have configured how to provide A object and want to use it as AProtocol: container.get(A)==container.get(AProtocol).

Provider object has also a .alias method with the same logic.

from dishka import alias, provide, Provider, Scope

class UserDAO(Protocol): ...
class UserDAOImpl(UserDAO): ...

class MyProvider(Provider):
    user_dao = provide(UserDAOImpl, scope=Scope.REQUEST)
    user_dao_proto = alias(source=UserDAOImpl, provides=UserDAO)

Additionally, alias has own setting for caching: it caches by default regardless if source is cached. You can disable it providing cache=False argument.

Do you want to override the alias? To do this, specify the parameter override=True. This can be checked when passing proper validation_settings when creating container.

from dishka import provide, Provider, Scope, alias, make_container

class UserDAO(Protocol): ...
class UserDAOImpl(UserDAO): ...
class UserDAOMock(UserDAO): ...

class MyProvider(Provider):
    scope = Scope.APP  # should be REQUEST, but set to APP for the sake of simplicity

    user_dao = provide(UserDAOImpl)
    user_dao_mock = provide(UserDAOMock)

    user_dao_proto = alias(UserDAOImpl, provides=UserDAO)
    user_dao_override = alias(
        UserDAOMock, provides=UserDAO, override=True
    )

container = make_container(MyProvider())
dao = container.get(UserDAO)  # UserDAOMock