我非常喜欢使用依赖注入技术来解耦我的代码。这通常涉及向其依赖项的构造函数中提供具有功能的对象。
我第一次使用 django 制作 Web api(附加对象数据库)。我打算将复杂的依赖项注入到原本简单的方法中。 (在我的例子中,它是解释来自 RabbitMQ 交换的消息的功能,但我的最小示例只是将通用消息解释为依赖于站点的字典)。
然而,在 django 中,所有内容似乎都是从静态方法或类定义中自动生成的,我找不到实际实例化或可定制的内容以将依赖项推入其中。
该技术和 django 框架是否不兼容,或者我遗漏了什么?
(最小的示例重新创建,不是实际代码)
在 urs.py 中:
urlpatterns = [
path("run/", views.run),
]
在views.py中
def run(request):
interpreter = AbstractDataInterpreter() #This is the object I want to inject
data = interpreter.interpret(request)
return JsonResponse(data, safe=False)
我有一个测试班
TestDataInterpreter
用于测试。
我有课
CustomDataInterpreter
为我的域/生态系统定制。
我计划在未来的不同部署中安排其他口译员。
但是我找不到在不同部署上实际将解释器注入到运行命令中的机制。
在Python中,你可以编写一个“类”,其目的是被其他类继承,但它本身是没有用的。您将在 Django 基于类的视图文档中找到被描述为“Mixin”类的此类。基本规则(避免多重继承引起的疯狂)是 Mixin 类应该继承自
object
并且始终继承到它们所混合到的类的左侧。见下文。
同样在 Python 中,使用 type
函数的三参数形式来
动态构造一个类也非常容易。 所以静态声明如
class MyView( LoginRequiredMixin, ListView):
pass
可能会动态创建为
MyView = type( 'MyView', # __name__ of the class,
(LoginRequiredMixin, ListView), # classes it inherits from, ordered
{} # __dict__ (added class vars and methods)
)
我不得不承认对“依赖注入”并不完全确定,但希望你可以使用它以Pythonic方式获得你想要的代码模式?