diff --git "a/\345\224\220\345\255\235\345\235\232/20240527-Models \347\261\273\345\236\213\347\232\204\351\233\206\345\220\210.md" "b/\345\224\220\345\255\235\345\235\232/20240527-Models \347\261\273\345\236\213\347\232\204\351\233\206\345\220\210.md" new file mode 100644 index 0000000000000000000000000000000000000000..57ac7d4f30c45e1aa635b56a41e678a8f784ec9f --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240527-Models \347\261\273\345\236\213\347\232\204\351\233\206\345\220\210.md" @@ -0,0 +1,36 @@ +### 初始化属性的集合示例 + +这个示例展示了如何定义一个带有初始化属性的类,该属性是一个 List 类型的集合。 + +```csharp +public class Comment +{ + public int Id { get; set; } + public string Text { get; set; } +} + +public class Post +{ + public int Id { get; set; } + public string Title { get; set; } + public List Comments { get; set; } = new List(); +} + +``` + +```csharp +var post = new Post +{ + Id = 1, + Title = "First Post" +}; + +// 添加评论 +post.Comments.Add(new Comment { Id = 1, Text = "Great post!" }); +post.Comments.Add(new Comment { Id = 2, Text = "Thanks for sharing." }); + +// 访问评论 +foreach (var comment in post.Comments) +{ + Console.WriteLine($"Comment ID: {comment.Id}, Text: {comment.Text}"); +} diff --git "a/\345\224\220\345\255\235\345\235\232/20240528-\344\275\277\347\224\250DTO\350\277\233\350\241\214\346\225\260\346\215\256\344\274\240\350\276\223.md" "b/\345\224\220\345\255\235\345\235\232/20240528-\344\275\277\347\224\250DTO\350\277\233\350\241\214\346\225\260\346\215\256\344\274\240\350\276\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..84ccb8e83ba53686f2f8357caf752931c5eba071 --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240528-\344\275\277\347\224\250DTO\350\277\233\350\241\214\346\225\260\346\215\256\344\274\240\350\276\223.md" @@ -0,0 +1,82 @@ +## 什么是DTO? +- DTO全称为数据传输对象(Data Transfer Object),在编程中常用到。 +- 在.NET Core中,DTO常用于API开发中,特别是用于请求和响应的数据格式化。 + +## DTO的作用 +- 在API开发中,大部分DTO属于响应请求DTO格式。 +- DTO的作用在于精简数据,避免返回或存储整个对象,通常用于去除敏感信息或不必要的数据。 + +## DTO的应用场景 +- 响应DTO:用于精简响应数据,例如去除密码等敏感信息。 +- 请求DTO:用于规范前端提交的数据格式,避免发送整个模型。 + +## DTO的实现 +- 在项目中创建DTO文件夹,根据模型的不同,将DTO分门别类放置。 +- 创建DTO模型时,可根据需求去除不需要的属性。 +- 使用扩展方法实现DTO的转换,可以将数据从原模型转换为DTO模型。 + +## 使用示例 +1. 创建股票的DTO模型,根据需求去除不需要的属性,例如评论信息。 +```c# +// StockDTO.cs + +public class StockDTO +{ + public int ID { get; set; } + public string Symbol { get; set; } + public string CompanyName { get; set; } + public decimal LastDividend { get; set; } + public string Industry { get; set; } + public decimal MarketCap { get; set; } +} +``` +2. 使用扩展方法将股票模型转换为DTO模型,保留需要的属性。 +```C# +// StockMapper.cs + +public static class StockMapper +{ + public static StockDTO ToStockDTO(this StockModel stockModel) + { + return new StockDTO + { + ID = stockModel.ID, + Symbol = stockModel.Symbol, + CompanyName = stockModel.CompanyName, + LastDividend = stockModel.LastDividend, + Industry = stockModel.Industry, + MarketCap = stockModel.MarketCap + }; + } +} +``` +3. 在控制器中使用Select方法进行数据转换,以确保返回给用户的数据符合DTO格式。 +```c# +// StockController.cs + +using System.Linq; + +[ApiController] +[Route("api/[controller]")] +public class StockController : ControllerBase +{ + private readonly IStockRepository _stockRepository; + + public StockController(IStockRepository stockRepository) + { + _stockRepository = stockRepository; + } + + [HttpGet] + public IActionResult GetStocks() + { + var stocks = _stockRepository.GetAll(); + var stockDTOs = stocks.Select(stock => stock.ToStockDTO()); // 使用Select方法转换数据为DTO + return Ok(stockDTOs); + } +} +``` + +## 注意事项 +- DTO的设计应根据实际需求精简数据,避免传输和存储不必要的信息。 +- 可以考虑使用扩展方法和`Select`方法实现DTO的转换,也可选择使用AutoMapper等工具。 \ No newline at end of file diff --git "a/\345\224\220\345\255\235\345\235\232/20240530-POST.md" "b/\345\224\220\345\255\235\345\235\232/20240530-POST.md" new file mode 100644 index 0000000000000000000000000000000000000000..453328cc03c526a3da3565348afaa3b722a3da0e --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240530-POST.md" @@ -0,0 +1,19 @@ +## POST +![](https://gitee.com/a-dove/figure-bed/raw/master/2024-6-222:17:09-NoteGPT_MindMap_1717337796522.png) +数据创建在Web开发和API的世界中被称为POST,是一种用于数据创建的HTTP动词。 +在API中创建数据的过程是:先将Json数据提交到服务器,然后服务器使用编写的代码将数据放入数据库。 +使用Entity Framework进行数据创建时,会使用add方法将Json数据放入追踪状态,但不会立即保存到数据库中,需要运行save changes方法才会保存到数据库。 +创建控制器端点时,使用HTTP的POST方法,同时使用from body来接收Json数据,并创建请求DTO来限制用户提交的数据。 +需要创建一个mapper将请求DTO映射为数据模型,因为Entity Framework无法直接接收DTO形式的数据。 +在控制器中将数据模型保存到数据库时,先创建数据模型对象,然后使用add方法添加到数据库,并使用save changes方法保存更改。 +最后使用created at方法返回保存后的数据模型。 + +创建数据的目的是为了在Web开发和API的世界中创建数据。 +使用POST方法提交Json数据到服务器,并使用代码将数据保存到数据库中。 +使用Entity Framework的add方法将数据放入追踪状态,但不会立即保存到数据库中。 +要保存更改,需要运行save changes方法。 +在控制器中使用HTTP的POST方法,并使用from body接收Json数据。 +创建请求DTO来限制用户提交的数据。 +使用mapper将请求DTO映射为数据模型。 +使用add方法将数据模型添加到数据库,并使用save changes方法保存更改。 +使用created at方法返回保存后的数据模型。 \ No newline at end of file diff --git "a/\345\224\220\345\255\235\345\235\232/20240531-PUT.md" "b/\345\224\220\345\255\235\345\235\232/20240531-PUT.md" new file mode 100644 index 0000000000000000000000000000000000000000..47453f598c4b6a41ac95220051bc8d4d54c0a283 --- /dev/null +++ "b/\345\224\220\345\255\235\345\235\232/20240531-PUT.md" @@ -0,0 +1,37 @@ +## PUT +![](https://gitee.com/a-dove/figure-bed/raw/master/2024-6-222:19:29-NoteGPT_MindMap_1717337962167.png) +更新是指通过发送数据来更新现有的记录。与创建不同,更新有几个不同之处。 +首先,你需要发送ID来标识现有的记录,大多数情况下是通过ID来标识。如果你不知道记录是否存在,那么如何更新它是没有意义的。 +另外,当你发送一个对象时,它会更新整个对象。这与 patch 操作非常不同,patch 只会更新一两个字段。如果你在更新时将某个字段设为 null,它将会变成 null;如果你将某个字段设为 1,那么它将会变成 1;如果你将某个字段设为 0,那么它将会变成 null。如果你不发送任何数据,那么该字段将保持不变。与 patch 不同的是,更新操作是非常精确的。 +除此之外,更新还有其他的不同之处。对于创建操作,我们只需将数据添加到数据库中即可。但是对于更新操作,它变得更加复杂,首先你需要进行搜索,使用 first 或者 default 方法,或者使用其他搜索算法来找到对应的现有记录。 +当你获取到数据库中的记录后,下一步就是编辑该对象。需要注意的是,实体框架会在后台跟踪你所做的更新操作。例如,如果我们想将 “Microsoft” 改为 “Microsoft Software LLC”,我们只需直接修改该对象的 company name 属性,然后在运行 save changes 方法时,SQL 语句将被发送到数据库进行更新。但是请记住,与创建操作一样,后台也会进行跟踪,仅仅编辑对象是不够的,你必须运行 save changes 方法才能将更新操作应用到数据库中。 + +代码示例: +```c# +[HttpPut("{id}")] +public IActionResult Update(int id, [FromBody] UpdateStockRequestDto updateDto) +{ + var stock = _repository.GetStock(id); // 根据ID查找现有记录 + if (stock == null) + { + return NotFound(); // 如果记录不存在,则返回 404 Not Found + } + + // 更新对象 + stock.CompanyName = updateDto.CompanyName; + stock.Purchase = updateDto.Purchase; + stock.Industry = updateDto.Industry; + stock.MarketCap = updateDto.MarketCap; + + _repository.SaveChanges(); // 保存更改 + + var stockDto = _mapper.Map(stock); + return Ok(stockDto); // 返回更新后的记录 +} +``` + +在上述代码中,我们通过 GetStock 方法从仓储中获取现有的股票记录,并进行更新操作。然后使用 AutoMapper 将更新后的记录映射为 StockDto 对象,并返回给客户端。 + +请注意,为每个不同的 API 端点创建独立的 DTO 是非常重要的,因为它们经常发生变化,不同的端点可能需要不同的字段。建议为每个端点创建一个单独的 DTO。 + +希望以上内容对您有所帮助。 \ No newline at end of file