Как работать с внедрением зависимостей в Django?

В настоящее время я пытаюсь управлять инъекцией зависимостей в приложении django. Я нашел эту тему ( Правильно ли делать внедрение зависимостей в Django? ) и попробовал следующий простой пример, основанный на том, что я там нашел.

/dependencyInjection/serviceInjector.py

from functools import wraps

class ServiceInjector:

    def __init__(self):
        self.deps = {}

    def register(self, name=None):

        name = name
        def decorator(thing):
            """
            thing here can be class or function or anything really
            """

            if not name:
                if not hasattr(thing, "__name__"): 
                    raise Exception("no name")
                thing_name = thing.__name__ #Set the name of the dependency to the name of the class
            else:
                thing_name = name   
            self.deps[thing_name] = thing 
            return thing

        return decorator

    def inject(self, func):

        @wraps(func)
        def decorated(*args, **kwargs):
            new_args = args + (self.deps, )
            return func(*new_args, **kwargs)

        return decorated

init.py

from backend.dependencyInjection.serviceInjector import ServiceInjector

si = ServiceInjector()

/core/articleModule.py

from backend.core.IarticleModule import IarticleModule
from models import Article
from backend.__init__ import si 

@si.register()
class articleModule(IarticleModule):
    def getArticleByLioId(self, lioId: str) -> Article:
        return Article.objects.get(lioId = lioId)

/services/articleManagementService.py

from backend.services.IarticleManagementService import IarticleManagementService
from backend.models import Article
from backend.__init__ import si 

@si.register()
class articleManagementService(IarticleManagementService):
    @si.inject
    def __init__(self, _deps):  
        articleModule = _deps['articleModule']
        self._articleModule = articleModule()

    def getArticleByLioId(self, lioId: str) -> Article:
        return self._articleModule.getArticleByLioId(lioId)

/views.py

from backend.__init__ import si

class article(View): 
    @si.inject
    def __init__(self, _deps):
        self._articleManagementService = _deps['articleManagementService']
    def get(self, request, articleId): 
        article = self._articleManagementService.getArticleByLioId(articleId)
        return article

При выполнении этого кода я получаю следующую ошибку: articleManagementService.getArticleByLioId() missing 1 required positional argument: 'lioId'

Мне кажется, что articleManagementService получает неинстанцированную версию класса articleModule. Есть ли способ решить это, чтобы заставить эту идею работать нормально?

Извините за длинный вопрос, я постарался включить только необходимые части кода.

Вернуться на верх