首页 > 解决方案 > json序列化方法应该如何处理应该是链接的attrs?

问题描述

我正在尝试在一个小型 REST 服务中实现 DDD/clean 架构原则。我有一个任务类:

@attr.s
class Task:
    id: str = attr.ib()
    url: str = attr.ib()

    images_paths: Optional[List[str]] = attr.ib(default=None)
    text_path: Optional[str] = attr.ib(default=None)

而且我需要两种 json 序列化方法。我需要一个能够将 json 对象存储在 mongodb 中,然后以相同的状态检索它。所以我希望json看起来如下:

{'id': '1', 'url': 'aaa.com', 'images_paths': ['img.png'], text_path: 'text.txt'}

还有一个是 REST API 的 json 输出

{'id': '1', 'url': 'aaa.com', 'images_paths': ['localhost/tasks/1/images/img.png'], text_path: 'localhost/tasks/1/text/text.txt'}

根据 DDD 原则,我认为两者都是 json 序列化方法,应该在基础设施层,对吗?从 DDD 的角度来看,它们是否正确?它们应该如何被称为都是 json 序列化?

而且我也不确定测试。流行的序列化测试是:

assert task_from_json(task_to_json(task)) == task

但是我不能对 REST API json 案例做这样的测试

标签: restserializationdomain-driven-designclean-architecture

解决方案


从干净架构的角度来看,业务层您不应该关心如何将对象存储在数据库中或如何在 Web 中表示它。

你的业务层应该知道有一个接口,负责存储和获取对象

interface TaskStorage {
    fun save(Task)
    fun fetchTaskById(id: Integre): Task
}

和网络表示的界面

interface SomeView {
    fun render(Task)
}

并且只有数据层会知道 Task 应该被转换为json表示形式并存储到 Mongo。并且只有视图层会知道 Task 将表示为json

当然,您应该有 2 个从 Task 到的转换器json

  • 一个在数据访问层
  • 一个在表示层上。

主要思想是:领域层不应该知道任何 Json 表示


推荐阅读