rest - 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 案例做这样的测试
解决方案
从干净架构的角度来看,业务层您不应该关心如何将对象存储在数据库中或如何在 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 表示
推荐阅读
- javascript - Basic Paper Rock Scissors 玩家选择返回未定义
- docker - Docker - 在入口点重定向输出
- firebase - Firebase - 无法通过 Google 登录进行身份验证
- jquery - 如何为纯文本电子邮件客户端添加换行符
- java - 创建应用程序时出现 Jhipster Ionic 错误:getJhipsterAppConfig 不是函数
- python - 模块 Pygame 没有 init 成员?
- python - ImportError:无法导入名称“文档”
- python-3.x - 计算 df 中一系列列的所有非零值
- dynamics-crm-2013 - 使用 CrmServiceClient 连接到 CRM2013 组织,“无法登录到 Dynamics CRM”使用 AuthType=IFD
- python - 生产中二级关联表添加复合主键