【问题标题】:Domain Driven Design Onion Architecture with Django Rest Framework使用 Django Rest 框架的领域驱动设计洋葱架构
【发布时间】:2018-03-26 09:53:04
【问题描述】:

我最近一直在阅读有关领域驱动设计 (DDD) 的文章,我喜欢这个概念,尤其是洋葱架构的想法与之相匹配 (https://www.youtube.com/watch?v=pL9XeNjy_z4)。

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

  1. 是否可以将 Onion 架构中的概念映射到 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)

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

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

我会在urls.py中有对应的url:

router.register(r'libraries', LibraryViewSet)

在 views.py 中执行 CRUD 操作:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        最近更新 更多