领域驱动设计洋葱架构与Django休息框架

时间:2018-03-26 09:53:05

标签: django django-rest-framework domain-driven-design onion-architecture

我最近一直在阅读有关域驱动设计(DDD)的内容,我喜欢这个概念,特别是Onion架构的概念与它一起使用(https://www.youtube.com/watch?v=pL9XeNjy_z4)。

我很想知道我们可以用Django Rest Framework实现这样的架构,或者换句话说我们可以用洋葱拱形式的Django休息框架来做DDD吗?

  1. 是否可以将洋葱架构中的概念映射到DRF?
  2. 像Apache isis(https://isis.apache.org/)这样的框架通过构建面向对象的UI来做DDD,用户可以直接与域实体交互,DRF可以如何做这些事情?
  3. 作为一个例子,我以下列方式编写DRF代码:

    在models.py中,我会定义我的模型:

    class Library(models.Model):
        library_id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=30)
        ...
    
        #This helps to print in admin interface
        def __str__(self):
            return u"%s" % (self.name)
    

    在serializers.py中我会有我的模型序列化器:

    class LibrarySerializer(serializers.ModelSerializer):
        class Meta:
            model = Library
            fields = '__all__'
    

    我会在urls.py中找到相应的网址:

    router.register(r'libraries', LibraryViewSet)
    

    并在views.py中执行CRUD操作:

    class LibraryViewSet(viewsets.ModelViewSet):
        queryset = Library.objects.all()
        serializer_class = LibrarySerializer
    

    这与DDD /洋葱架构有什么关系(可能有适当的修改)?

2 个答案:

答案 0 :(得分:0)

简短的回答:DRF和DDD +六角形架构不是最好的朋友。

当模型反映(主题,手头的问题)时,最有可能出现在CRUD的对立面中。 创建,读取,更新,删除是并非总是无所不在的语言一部分的操作。

此外,洋葱/六角形体系结构将要求该模型不依赖于任何框架或库代码。可以反转这些依赖关系并使其持久性和传递机制取决于您的模型(而不是在您的域内使用任何Django导入),但是对于Django无疑是困难的。该框架规定了与此相反的情况。

答案 1 :(得分:0)

DDD 的想法更多是关于关注点分离。将逻辑与框架功能分离是至关重要的,在任何框架中都是如此。如果您使用 django 中的持久性/ORM 东西很好,但不要将它与您的域逻辑混淆,请始终将其分开。该逻辑也应该适用于不同的 ORM。中间应该总是有某种层。