Я пытаюсь внедрить зависимости в мое представление Django (контроллер?).Вот некоторый фон.
Обычно файл urls.py
обрабатывает маршрутизацию.Обычно это что-то вроде этого:
urlpatterns = [
path("", views.get_all_posts, name="get_all_posts"),
path("<int:post_id>", views.get_post, name="get_post"),
path("create", views.create_post, name="create_post"),
]
Проблема в том, что как только вы доберетесь до create_post
, например, вы можете зависеть от службы, которая создает сообщения:
# views.py
...
def create_post(self):
svc = PostCreationService()
svc.create_post()
Этот тип шаблона трудно проверить.Хотя я знаю, что в библиотеках тестирования Python есть инструменты для насмешек такого рода, я бы предпочел внедрить зависимость в представление.Вот что я придумал.
Класс Controller, имеющий статический метод, export(deps)
, который принимает список зависимостей и возвращает список объектов шаблона URL:
class ApiController(object):
@staticmethod
def export(**deps):
ctrl = ApiController(**deps)
return [
path("", ctrl.get_all_posts, name="get_all_posts"),
path("<int:post_id>", ctrl.get_post, name="get_post"),
path("create", ctrl.create_post, name="create_post"),
]
def __init__(self, **deps):
self.deps = deps
def get_all_posts():
pass
...
Это выглядит странно, но я не знаю другого способа сделать то, что я пытаюсь сделать.Контроллер должен возвращать список шаблонов URL, а также должен принимать список зависимостей.Используя вышеописанную технику, я могу сделать это в urls.py
:
urlpatterns = ApiController.export(foo_service=(lambda x: x))
Теперь я могу свободно использовать foo_service
в любом из методов ApiController
.
Примечание:
Одной из альтернатив будет то, что конструктор вернет список URL, но я не вижу в этом большого улучшения по сравнению с этим.На самом деле, это кажется мне более запутанным, потому что конструктор класса будет возвращать список вместо экземпляра класса.
Примечание 2:
ЯПомните, что в python есть инструменты для насмешек над учениками.Пожалуйста, не предлагайте их использовать.Я хотел бы использовать DI как способ контроля и управления зависимостями.
Есть идеи, как лучше всего это сделать?