Skip to content

Using of configuration provider with some singleton providers #313

@iskorini

Description

@iskorini

Hi, I've a problem with wiring function and I don't understand where I'm wrong.
My classes are that:

ConfigurationContainer.py

from dependency_injector import containers, providers

class ConfigContainer(containers.DeclarativeContainer):
    config = providers.Configuration()

DependencyContainer.py

from dependency_injector import containers, providers

from src.DialogflowInteraction import DialogflowInteraction
from src.QA.ContextRetriever.VeryBasicContextRetriever import \
    VeryBasicContextRetriever
from src.QA.QA import QA


class BotDependencyFactory(containers.DeclarativeContainer):
    verybasiccontextretriever = providers.Singleton(VeryBasicContextRetriever)
    q_a = providers.Singleton(QA)
    dialogflowinteraction = providers.Singleton(DialogflowInteraction)

Bot.py

import logging
from uuid import uuid1
import sys
from dependency_injector.wiring import Provide

from src.ConfigurationContainer import ConfigContainer
from src.DependencyContainer import BotDependencyFactory



class Bot():
    
    def __init__(
        self, 
        threshold=Provide[ConfigContainer.config.general.threshold.as_float()],
        q_a = Provide[BotDependencyFactory.q_a],
        context_retriever = Provide[BotDependencyFactory.verybasiccontextretriever],
        dialogflowinteraction = Provide[BotDependencyFactory.dialogflowinteraction]
        ):
        self.threshold = threshold
        self.QA = q_a
        self.context_retriever = context_retriever
        self.df_bot = dialogflowinteraction

app.py

import logging
import os
import sys

from src.ConfigurationContainer import ConfigContainer
from src.DependencyContainer import BotDependencyFactory
from src.bot import Bot


def configure_env():
    logging.basicConfig(level=logging.INFO)
    config = ConfigContainer()
    config.config.from_ini('config.ini')
    logging.info('configuration completed')
    return config

if __name__ == '__main__':
    config = configure_env()
    config.wire(modules=[sys.modules[__name__]])
    logging.info('Configuration container wired successfully')
    bot_dependency_factory = BotDependencyFactory()
    bot_dependency_factory.wire(modules=[sys.modules[__name__]])
    bot = Bot()    

When I try to run main method returns this exception

INFO:root:configuration completed
Traceback (most recent call last):
  File "C:\Users\Federico\anaconda3\envs\deepcleverbot\lib\site-packages\dependency_injector\wiring.py", line 111, in _resolve_provider
    return self._map[original]
KeyError: <dependency_injector.providers.Singleton(<class 'src.QA.QA.QA'>) at 0x256758fd630>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:/Users/Federico/Desktop/DeepCleverBot/bot/app.py", line 24, in <module>
    config.wire(modules=[sys.modules[__name__]])
  File "src/dependency_injector/containers.pyx", line 195, in dependency_injector.containers.DynamicContainer.wire
  File "C:\Users\Federico\anaconda3\envs\deepcleverbot\lib\site-packages\dependency_injector\wiring.py", line 162, in wire
    _patch_fn(member, method_name, method, providers_map)
  File "C:\Users\Federico\anaconda3\envs\deepcleverbot\lib\site-packages\dependency_injector\wiring.py", line 193, in _patch_fn
    injections = _resolve_injections(fn, providers_map)
  File "C:\Users\Federico\anaconda3\envs\deepcleverbot\lib\site-packages\dependency_injector\wiring.py", line 218, in _resolve_injections
    provider = providers_map.resolve_provider(marker.provider)
  File "C:\Users\Federico\anaconda3\envs\deepcleverbot\lib\site-packages\dependency_injector\wiring.py", line 55, in resolve_provider
    return self._resolve_provider(provider)
  File "C:\Users\Federico\anaconda3\envs\deepcleverbot\lib\site-packages\dependency_injector\wiring.py", line 113, in _resolve_provider
    raise Exception('Unable to resolve original provider')
Exception: Unable to resolve original provider

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions