具有Django Rest框架的领域驱动设计洋葱架构

Thi*_*ker 5 django domain-driven-design onion-architecture django-rest-framework

我最近在阅读有关域驱动设计(DDD)的文章,我喜欢这个概念,尤其是Onion体系结构的构想(https://www.youtube.com/watch?v=pL9XeNjy_z4)。

我很想知道我们如何使用Django Rest Framework实现这种架构,或者换句话说,我们可以使用Onion arch风格的Django rest框架进行DDD吗?

  1. 是否可以将洋葱架构中的概念映射到DRF?
  2. 当像Apache isis(https://isis.apache.org/)之类的框架通过构建面向对象的UI来进行DDD时,用户可以直接与域实体进行交互,DRF可能怎么做?

作为示例,我以以下方式编写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)
Run Code Online (Sandbox Code Playgroud)

在serializers.py中,我将使用模型序列化器:

class LibrarySerializer(serializers.ModelSerializer):
    class Meta:
        model = Library
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

我将在urls.py中有相应的url:

router.register(r'libraries', LibraryViewSet)
Run Code Online (Sandbox Code Playgroud)

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

class LibraryViewSet(viewsets.ModelViewSet):
    queryset = Library.objects.all()
    serializer_class = LibrarySerializer
Run Code Online (Sandbox Code Playgroud)

这与DDD / Onion体系结构有什么关系(可能进行了适当的修改)?

ist*_*iuk 4

简短回答:DRF 和 DDD+Hexagonal 架构并不是最好的朋友。

当模型反映领域(主题、手头的问题)时,它很可能处于 CRUD 的对立面。创建、读取、更新、删除这些操作并不总是属于您的通用语言的一部分。

此外,洋葱/六边形架构要求模型不依赖于任何框架或库代码。反转这些依赖关系并使持久性和交付机制依赖于您的模型是可能的(不在您的域内使用任何 Django 导入),但使用 Django 肯定会很困难。该框架的规定与这一切相反。