Как обрабатывать циклически зависимую структуру данных в машинописи - PullRequest
0 голосов
/ 30 сентября 2019

Я устанавливаю новое веб-приложение. Существует API на основе Laravel, который взаимодействует с Angular Application. Теперь есть следующая ситуация, которая будет происходить несколько раз, и я не знаю, как правильно с ней справиться.

В качестве примера приведен набор пользователей и проектов. Обе модели связаны промежуточной таблицей / моделью ProjectTeam. Я попытался проиллюстрировать ситуацию на следующем рисунке:

Model illustration

Теперь, если пользователь входит в систему, я хочу загрузить данные пользователя с его проектами. Таким образом, мой API отправит мне JSON-подобный:

[
  {
    id: 12,
    email: "example@mail.xy",
    projects: [
      {
        name: "Project X",
        created: 2019,
        ...
      },
      ...
    ]
  },
  ...
]

Но иногда я хочу загрузить команду проекта (например, для администрирования команды), и я получу JSON следующим образом: (Просто инвертированныйверсия)

[
  {
    name: "Project X",
    created: 2019,
    team: [
      {
        id: 12,
        email: "example@mail.xy",
        ...
      },
      ...
    ]
  },
  ...
]

Теперь в моем угловом приложении я создаю объект для извлеченных данных:

export class Project {
  name: string;
  created: number | Date;
  team: ProjectTeam;

  constructor(data: ProjectAPI) {
    this.name = data.name;
    this.created = data.created;
    this.team = new ProjectTeam(data.team);
  }
}

export interface ProjectAPI { ... }

export class ProjectTeam {
  members: []ProjectTeamMember;

  constructor(data) {
    this.members = data.map(elm => new ProjectTeamMember(elm));
  }
}

export class ProjectTeamMember {
  user: User;
  ...

  constructor(data) {
    this.user = new User(data);
  }
}

export class User {
  id: number;
  projects: []Project;
  ...

  constructor(data) {
    this.id = data.id;
    this.projects = data.projects ? data.projects.map(elm => new Project(elm)) : null;
    // Here i would get a circular dependency
    ...
  }
}

И я бы сделал то же самое, если бы мог, нотогда я получу круговую зависимость.

Так, как правильно решить эту проблему? Или вы не стали бы создавать экземпляры объектов и просто управлять вложенными данными через интерфейс?

Спасибо за ваши ответы:)

...