Что является лучшей практикой для Dependency Injection в Django/Python?
Я работаю над продуктом на основе Django, который работает как посредник/прокси между корпоративной ERP и некоторыми мобильными клиентами. Поэтому он должен обладать масштабируемостью и простотой обслуживания в долгосрочной перспективе.
Одна из проблем, с которой я сейчас сталкиваюсь, это возможность иметь множество версий как для API, которые я выставляю клиентам, так и для API, которые я потребляю из ERP.
Я располагаю свою бизнес-логику в отдельном модуле в каждом приложении под названием *_usecase.py
, по существу я должен реализовать версионность, имея базовый класс UseCase и переопределяя методы для каждой версии и предоставляя нужный экземпляр класса для просмотра через DI на основе значений заголовков запроса/ответа.
Итак, я добрался до этого пакета python-inject. В нем есть довольно аккуратные декораторы для инъекции экземпляров на основе имеющейся у вас конфигурации и аннотация типа для параметров метода. что-то вроде:
# in view.py
@inject.autoparams()
def send_notification(
request,
use_case: SendNotificationUseCase,
# as many type annotated parameters you required
):
pass
# in binder.py
binder.bind_to_provider(
SendNotificationUseCase,
self.provide_send_notification_use_case
)
def provide_send_notification_use_case(self):
# some check and logic to evaluate appropriate version
return SendNotificationUseCaseV1() # v1 implementation of usecase
Итак, этот пакет в конечном итоге делает свою работу, хотя у меня были некоторые незначительные проблемы с ним, но, поскольку у него не так много звезд и я не видел его использования где-либо в сообществе, я хочу знать, есть ли у вас, ребята, лучшее/более питоническое решение для Dependency Injection в Django/Python, а также для этой проблемы версионирования, о которой я упоминал.