asp.net 如何在C# Web API中构造数据对象以避免FE问题

kpbwa7wx  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(126)

我有一个C#课程的作业,我正在做-基本上创建一个To Do应用程序与相关的FE,后端C# Web API。我已经设法完成了Web API,并有奖金标记可用于创建一个系统,您可以有多个用户谁可以从不同的设备登录,也有不同的列表-说“工作”和“个人”所以我创建了一个User对象和To Do List对象。由于它们都是链接的,而且我使用的是EFCore,所以我将它们结构化为:

public class ToDo
{
public Guid Id { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public bool? InProgress { get; set; }
public bool? IsComplete { get; set; }
public DateTime Created { get; set; } = DateTime.Now;
public ToDoList? ToDoList { get; set; }
public Guid? ToDoListId{ get; set; }
}

字符串
待办事项列表对象:

public class ToDoList
{
public Guid Id { get; set; }
public string? Title { get; set; }
public List<ToDo>? ToDos { get; set; } // Each to-do list contains multiple to-dos
// Foreign Key to User
public Guid UserId { get; set; }
public User? User { get; set; }
}


User对象:

public class User
{
public Guid Id { get; set; }
public string? Name { get; set; }
public string? Email { get; set; }
public string? Password { get; set; }
public string? ProfilePhotoUrl { get; set; } // Store the URL to the user's profile photo
public List<ToDoList>? ToDoLists { get; set; } // A user can have multiple to-do lists
}


基本关系是->一个用户可以有多个待办事项列表->可以有多个待办事项对象。
我已经在我的后端实现了这一点,并使用Swagger进行了测试。它工作得很好,但当我尝试添加一个带有关联的To Do List的To Do Object时,Swagger说我需要发送的数据对象应该是这样的:

{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"inProgress": true,
"isComplete": true,
"created": "2023-10-26T06:43:42.157Z",
"toDoList": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"title": "string",
"toDos": [
"string"
],
"userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"user": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"email": "string",
"password": "string",
"profilePhotoUrl": "string",
"toDoLists": [
"string"
]
}
},
"toDoListId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}


类似地,对于一个To Do List对象,Swagger说数据结构应该是这样的:

{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"title": "string",
"toDos": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"inProgress": true,
"isComplete": true,
"created": "2023-10-26T06:43:42.167Z",
"toDoList": "string",
"toDoListId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"userId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"user": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"email": "string",
"password": "string",
"profilePhotoUrl": "string",
"toDoLists": [
"string"
]
}
}


我的问题是-在FE上我的计划是:
当一个用户登录时,他们的用户ID会保存在某个地方--它可能会处于React的全局状态。
当他们加载主页面时,对他们的ToDoList的请求将包括该User ID。控制器应该查找与该User ID相关联的所有To Do List并将其返回给User。理想情况下,List对象应该具有的唯一内容是To Do Items的标题,而不是关于它们的所有细节。
如果他们想查看特定的待办事项,他们可以点击该项目,然后进入另一个页面,在那里他们可以看到有关该项目的所有详细信息。
这里的问题是我现在的数据结构,创建一个待办事项需要一堆关于用户的细节,这似乎是不必要的。同样,创建一个待办事项列表需要从一开始就所有的待办事项,这并不使,因为它将是空的,当它被创建时。
所以我的问题是,你会如何处理这个问题?什么是最好的方法来解决这个问题,或者我已经错误地处理这个问题开始?任何建议将不胜感激。

vh0rcniy

vh0rcniy1#

有多种方法可以解决这个问题,但在我看来,这就是你应该如何设计你的应用程序架构。
由于你只登录了用户,我们可以安全地假设用户已经在系统中。所以尝试使用restful模式,其中所有todos都由用户拥有。所以设计你的api看起来像/users/:userid/todos/:todoid。所以不要发送所有这些冗余数据,你可以只将todo实体发布到用户todos enpoint。基本上,原则是保持FE精简和愚蠢,并使用BE确保数据完整性。
附言:阅读关于HATEOAS的文章会给你给予很多见解。

相关问题