Как структурировать объекты данных в веб-API C#, чтобы избежать проблем с FE ⇐ C#
-
Anonymous
Как структурировать объекты данных в веб-API C#, чтобы избежать проблем с FE
У меня есть задание для курса C#, который я прохожу — по сути, создать приложение To Do со связанным FE, серверным веб-API C#. Мне удалось закончить работу над веб-API, и есть бонусы за создание системы, в которой вы можете иметь несколько пользователей, которые могут входить в систему с разных устройств, а также иметь разные списки - скажем, «Рабочий» и «Личный». Итак, я создал объект пользователя и объект списка дел. Поскольку все они связаны между собой и я использую EFCore, я структурировал их следующим образом:
публичный класс ToDo { общедоступный идентификатор Guid {get; набор; } общедоступная строка? Имя {получить; набор; } общедоступная строка? Описание {получить; набор; } публичный логический тип? InProgress {получить; набор; } публичный логический тип? IsComplete {получить; набор; } общественный DateTime Created {get; набор; } = ДатаВремя.Сейчас; общедоступный список дел? ToDoList {получить; набор; } общедоступное руководство? ToDoListId {получить; набор; } } Объект списка дел:
публичный класс ToDoList { общедоступный идентификатор Guid {get; набор; } общедоступная строка? Название {получить; набор; } общедоступный список? ToDos {получить; набор; } // Каждый список дел содержит несколько задач // Внешний ключ пользователя общественный Guid UserId {get; набор; } общедоступный пользователь? Пользователь {получить; набор; } }
И объект «Пользователь»:
Пользователь публичного класса { общедоступный идентификатор Guid {get; набор; } общедоступная строка? Имя {получить; набор; } общедоступная строка? Электронная почта {получить; набор; } общедоступная строка? Пароль {получить; набор; } общедоступная строка? ProfilePhotoUrl {получить; набор; } // Сохраняем URL-адрес фотографии профиля пользователя общедоступный список? ToDoLists {получить; набор; } // Пользователь может иметь несколько списков дел } Основное отношение: -> Пользователь может иметь несколько списков дел -> которые могут иметь несколько объектов дел.
Я реализовал это на своем сервере и протестировал с помощью Swagger. Это работает нормально, но когда я пытаюсь добавить объект дел со связанным списком дел, Сваггер говорит, что объект данных, который мне нужно отправить, должен выглядеть следующим образом:
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "описание": "строка", "inProgress": правда, «isComplete»: правда, "создано": "2023-10-26T06:43:42.157Z", "список дел": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "title": "строка", "toDos": [ "нить" ], "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "пользователь": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "электронная почта": "строка", "пароль": "строка", "profilePhotoUrl": "строка", "ToDoLists": [ "нить" ] } }, "toDoListId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" }
Аналогично для объекта списка дел, Сваггер говорит, что структура данных должна выглядеть следующим образом:
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "title": "строка", "toDos": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "описание": "строка", "inProgress": правда, «isComplete»: правда, "создано": "2023-10-26T06:43:42.167Z", "toDoList": "строка", "toDoListId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" } ], "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "пользователь": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "электронная почта": "строка", "пароль": "строка", "profilePhotoUrl": "строка", "ToDoLists": [ "нить" ] } } У меня проблема в том, что на FE мой план был:
Когда пользователь входит в систему, его идентификатор пользователя где-то сохраняется — вероятно, он будет в React, поэтому, возможно, в глобальном состоянии.
Когда они загружают главную страницу, запрос их ToDoLists будет включать этот идентификатор пользователя. Контроллер должен найти все списки дел, связанные с этим идентификатором пользователя, и вернуть их пользователю. В идеале единственное, что должен содержать объект List, — это заголовок элементов To Do, а не все подробности о них.
Если затем они захотят просмотреть определенные задачи, они могут, например, нажать на этот элемент и перейти на другую страницу, где смогут увидеть все подробности о нем.
Проблема здесь в том, что у меня сейчас есть структуры данных: для создания элемента задачи требуется множество подробностей о пользователе, которые кажутся ненужными. Аналогичным образом, для создания списка дел требуются все элементы дел с самого начала, чего не требуется, поскольку при создании он будет пустым.
Итак, мой вопрос: как бы вы подошли к этому вопросу? Как лучше всего это исправить или я изначально неправильно подошел к этому? Буду рад любым советам.
У меня есть задание для курса C#, который я прохожу — по сути, создать приложение To Do со связанным FE, серверным веб-API C#. Мне удалось закончить работу над веб-API, и есть бонусы за создание системы, в которой вы можете иметь несколько пользователей, которые могут входить в систему с разных устройств, а также иметь разные списки - скажем, «Рабочий» и «Личный». Итак, я создал объект пользователя и объект списка дел. Поскольку все они связаны между собой и я использую EFCore, я структурировал их следующим образом:
публичный класс ToDo { общедоступный идентификатор Guid {get; набор; } общедоступная строка? Имя {получить; набор; } общедоступная строка? Описание {получить; набор; } публичный логический тип? InProgress {получить; набор; } публичный логический тип? IsComplete {получить; набор; } общественный DateTime Created {get; набор; } = ДатаВремя.Сейчас; общедоступный список дел? ToDoList {получить; набор; } общедоступное руководство? ToDoListId {получить; набор; } } Объект списка дел:
публичный класс ToDoList { общедоступный идентификатор Guid {get; набор; } общедоступная строка? Название {получить; набор; } общедоступный список? ToDos {получить; набор; } // Каждый список дел содержит несколько задач // Внешний ключ пользователя общественный Guid UserId {get; набор; } общедоступный пользователь? Пользователь {получить; набор; } }
И объект «Пользователь»:
Пользователь публичного класса { общедоступный идентификатор Guid {get; набор; } общедоступная строка? Имя {получить; набор; } общедоступная строка? Электронная почта {получить; набор; } общедоступная строка? Пароль {получить; набор; } общедоступная строка? ProfilePhotoUrl {получить; набор; } // Сохраняем URL-адрес фотографии профиля пользователя общедоступный список? ToDoLists {получить; набор; } // Пользователь может иметь несколько списков дел } Основное отношение: -> Пользователь может иметь несколько списков дел -> которые могут иметь несколько объектов дел.
Я реализовал это на своем сервере и протестировал с помощью Swagger. Это работает нормально, но когда я пытаюсь добавить объект дел со связанным списком дел, Сваггер говорит, что объект данных, который мне нужно отправить, должен выглядеть следующим образом:
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "описание": "строка", "inProgress": правда, «isComplete»: правда, "создано": "2023-10-26T06:43:42.157Z", "список дел": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "title": "строка", "toDos": [ "нить" ], "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "пользователь": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "электронная почта": "строка", "пароль": "строка", "profilePhotoUrl": "строка", "ToDoLists": [ "нить" ] } }, "toDoListId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" }
Аналогично для объекта списка дел, Сваггер говорит, что структура данных должна выглядеть следующим образом:
{ "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "title": "строка", "toDos": [ { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "описание": "строка", "inProgress": правда, «isComplete»: правда, "создано": "2023-10-26T06:43:42.167Z", "toDoList": "строка", "toDoListId": "3fa85f64-5717-4562-b3fc-2c963f66afa6" } ], "userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "пользователь": { "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", "имя": "строка", "электронная почта": "строка", "пароль": "строка", "profilePhotoUrl": "строка", "ToDoLists": [ "нить" ] } } У меня проблема в том, что на FE мой план был:
Когда пользователь входит в систему, его идентификатор пользователя где-то сохраняется — вероятно, он будет в React, поэтому, возможно, в глобальном состоянии.
Когда они загружают главную страницу, запрос их ToDoLists будет включать этот идентификатор пользователя. Контроллер должен найти все списки дел, связанные с этим идентификатором пользователя, и вернуть их пользователю. В идеале единственное, что должен содержать объект List, — это заголовок элементов To Do, а не все подробности о них.
Если затем они захотят просмотреть определенные задачи, они могут, например, нажать на этот элемент и перейти на другую страницу, где смогут увидеть все подробности о нем.
Проблема здесь в том, что у меня сейчас есть структуры данных: для создания элемента задачи требуется множество подробностей о пользователе, которые кажутся ненужными. Аналогичным образом, для создания списка дел требуются все элементы дел с самого начала, чего не требуется, поскольку при создании он будет пустым.
Итак, мой вопрос: как бы вы подошли к этому вопросу? Как лучше всего это исправить или я изначально неправильно подошел к этому? Буду рад любым советам.
Мобильная версия