Как метод сериализации json делать с attrs, которые должны быть ссылками? - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь реализовать принципы DDD / чистой архитектуры в небольшом REST-сервисе.У меня есть класс задачи:

@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'}

И еще один, который будет выводом json из REST API

{'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

Но я не могу сделать такой тест для JEST-случая REST API

1 Ответ

1 голос
/ 20 мая 2019

С точки зрения чистой архитектуры, на бизнес-уровне вам не нужно заботиться о том, как хранить ваши объекты в базе данных или как представлять их в сети.

Ваш бизнес-уровень должен знать, что существует интерфейс, который отвечает за хранение и выборку объектов

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

и интерфейс для веб-представления

interface SomeView {
    fun render(Task)
}

И только слой данных будет знать, что Задача должна быть преобразована в json представление и сохранена в Mongo. И только слой представления будет знать, что Задача будет представлена ​​как json.

Конечно, у вас должно быть 2 конвертера из задачи в json:

  • один на уровне доступа к данным
  • и один на уровне представления.

И основная идея такова: доменный слой не должен знать о каком-либо представлении Json

...