From 36014bdd9cbf46443b6ba80382ed5081b0c492aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E6=98=A5=E7=BF=94=EF=BC=88=E7=A9=B7=E5=91=90-?= =?UTF-8?q?=EF=BC=89?= <907079131@qq.com> Date: Sun, 2 Jun 2024 21:46:16 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=BF=E5=B7=B4=E9=98=BF=E5=B7=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\345\277\203\350\277\207\347\250\213.md" | 58 ++++++++++++++ ...0\345\277\203\350\277\207\347\250\2132.md" | 80 +++++++++++++++++++ ...71\347\233\256\350\256\276\350\256\241.md" | 43 ++++++++++ ...23\345\202\250\346\250\241\345\274\217.md" | 69 ++++++++++++++++ 4 files changed, 250 insertions(+) create mode 100644 "\346\236\227\346\230\245\347\277\224/20240527_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\213.md" create mode 100644 "\346\236\227\346\230\245\347\277\224/20240528_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\2132.md" create mode 100644 "\346\236\227\346\230\245\347\277\224/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" create mode 100644 "\346\236\227\346\230\245\347\277\224/20240531.\344\273\223\345\202\250\346\250\241\345\274\217.md" diff --git "a/\346\236\227\346\230\245\347\277\224/20240527_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\213.md" "b/\346\236\227\346\230\245\347\277\224/20240527_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\213.md" new file mode 100644 index 0000000..9a938ac --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240527_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\213.md" @@ -0,0 +1,58 @@ + +## ASP.NET Core Web API开发要点总结 + +### 一、路由 +- **概念**:路由根据配置确定请求如何处理,定义不同URL地址对应的控制器和操作方法。 +- **示例**: +```c# +[Route("[controller]")] +public class BlogsController : ControllerBase +{ + public IActionResult Index() => Ok("999"); + + [Route("{id}")] + public IActionResult Single(int id) => Ok(id); +} +``` + +### 二、模型绑定 +- **概念**:将请求数据绑定到操作方法的参数或模型对象上,支持各种数据类型。 +- **Action特性**:[FromQuery], [FromForm], [FromHeader], [FromBody], [FromServices], [FromRoute], [BindRequired], [BindNever], [ApiController]. +- **示例**: +```c# +public class BlogDto +{ + public string Title { get; set; } + public string Author { get; set; } + public string Flag { get; set; } +} + +[HttpPost] +public ActionResult Post(BlogDto blogDto) => Ok(blogDto); +``` + +### 三、模型验证 +- **数据注解**:使用数据注解如[Required], [MinLength]进行数据验证。 +- **自定义验证**:可通过继承ValidationAttribute类或实现IValidatableObject接口自定义验证规则。 +- **示例**: +```c# +public class BlogDto +{ + [MinLength(2, ErrorMessage = "Title must be at least 2 characters")] + public string Title { get; set; } + + [Required(ErrorMessage = "Author is required")] + public string Author { get; set; } + + public string Flag { get; set; } +} +``` + +### 四、执行控制器方法Action +- **概念**:控制器中的公共函数称为Action,处理请求并返回HTTP响应。 +- **返回结果类型**:常见类型包括状态码、包含对象的状态码、重定向结果、内容结果等。 +- **示例**: +```c# +[HttpPut("{id}")] +public ActionResult Put(int id, BlogDto blogDto) => Ok(new { id, blogDto }); +``` diff --git "a/\346\236\227\346\230\245\347\277\224/20240528_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\2132.md" "b/\346\236\227\346\230\245\347\277\224/20240528_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\2132.md" new file mode 100644 index 0000000..6c5dad2 --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240528_API\347\232\204\346\240\270\345\277\203\350\277\207\347\250\2132.md" @@ -0,0 +1,80 @@ + +## ASP.NET Core Web API开发关键要点总结 + +### 五、过滤器 +- **概念**:类似于中间件,用于执行日志记录、身份验证、授权、异常处理和结果转换等操作。 +- **过滤器类型**:包括授权过滤器、资源过滤器、动作过滤器、异常过滤器和结果过滤器。 +- **示例**: +```c# +// ApiResult.cs +public class ApiResult +{ + public int Code { get; set; } + public string Msg { get; set; } + public object Data { get; set; } +} + +// ApiResultFilter.cs +namespace Api.Filters +{ + public class ApiResultFilter : IAsyncResultFilter + { + // 实现过滤器逻辑 + } +} + +// Startup.cs +public void ConfigureServices(IServiceCollection services) +{ + // 注册全局过滤器 + services.AddControllers(options => { + options.Filters.Add(); + }); +} +``` + +### 六、配置 +- **概念**:采用键值对表示配置项,支持多种配置源,如文件、命令行参数、环境变量等。 +- **访问JSON配置文件示例**: +```c# +// appsetting.json +{ + "MySettings": { + "Setting1": "Value1", + "Setting2": "Value2" + } +} + +// Startup.cs +private readonly IConfiguration _configuration; + +public void ConfigureServices(IServiceCollection services) +{ + var setting1 = _configuration["MySettings:Setting1"]; + Console.WriteLine($"Setting1: {setting1}"); +} +``` + +### 七、日志 +- **概念**:用于跟踪程序运行、调试和记录错误信息,包括系统日志和用户记录日志。 +- **Serilog**:流行的日志库,提供强大的日志记录功能。 +- **示例**: +```c# +// LogController.cs +public class LogController : ControllerBase +{ + private readonly ILogger _logger; + + public LogController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + public IActionResult Index() + { + _logger.LogInformation("Visited the homepage"); + return Ok("Welcome to the homepage"); + } +} +``` diff --git "a/\346\236\227\346\230\245\347\277\224/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" "b/\346\236\227\346\230\245\347\277\224/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" new file mode 100644 index 0000000..c32b449 --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" @@ -0,0 +1,43 @@ +# 项目设计概要 + +## 一、主体结构 +1. 采用Resultful风格的WebApi。 +2. 使用ASP.NET Core 8.0框架。 +3. 采用传统控制器模式。 + +## 二、模型设计(例如:图书管理系统) +### 1. 作者表 Authors +- 姓名(AuthorName) +- 性别(Gender) +- 出生年月(Birthday) + +### 2. 图书表 Books +- 书名(BookName) +- 出版社(Publisher) +- 作者ID(AuthorId) +- 价格(Price) + +## 三、内存型数据库(自定义的一个集合类) +在应用程序中定义一个类,专门提供模拟数据。 + +## 四、仓储系统(准备用来接入数据库的一套接口) +### 1. 通用型仓储接口 +定义通用的数据存取操作方法,例如增删改查。 + +### 2. 个性化的仓储接口 +针对特定业务需求而定义的数据存取接口,通常继承自通用型仓储接口,通过扩展通用接口来实现特定业务需求的操作。 + +## 五、利用主体结构,具体实现Resultful风格的关于两个表的CRUD +### 1. 作者表 +- 获取作者列表:GET /api/authors +- 获取指定作者:GET /api/authors/{authorId} +- 新增作者信息:POST /api/authors +- 修改作者信息:PUT /api/authors/{authorId} +- 删除作者信息:DELETE /api/authors/{authorId} + +### 2. 图书表(部署于作者表底下) +- 获取图书列表:GET /api/authors/{authorId}/books +- 获取指定图书:GET /api/authors/{authorId}/books/{bookId} +- 新增图书信息:POST /api/authors/{authorId}/books +- 修改图书信息:PUT /api/authors/{authorId}/books/{bookId} +- 删除图书信息:DELETE /api/authors/{authorId}/books/{bookId} diff --git "a/\346\236\227\346\230\245\347\277\224/20240531.\344\273\223\345\202\250\346\250\241\345\274\217.md" "b/\346\236\227\346\230\245\347\277\224/20240531.\344\273\223\345\202\250\346\250\241\345\274\217.md" new file mode 100644 index 0000000..f05ec6b --- /dev/null +++ "b/\346\236\227\346\230\245\347\277\224/20240531.\344\273\223\345\202\250\346\250\241\345\274\217.md" @@ -0,0 +1,69 @@ +### 集合接口 +- **ICollection**: `ICollection`接口由泛型集合类实现,可用于获取集合中的元素个数(`Count()`),添加和删除元素(`Add()`、`Remove()`、`Clear()`),以及将集合复制到数组中(`CopyTo()`方法)。 +- **IList**: `IList`接口允许通过位置访问元素列表,定义了索引器,可在集合的特定位置插入或删除项(`Insert()`和`RemoveAt()`方法)。`IList`接口继承自`ICollection`接口。 + +### 仓储模式 +仓储模式通常指使用Entity Framework Core实现数据持久化。 + +### 接口 +#### I实例名Repository +```c# +// 通过Id获取所有作者的实现 +实例对象? GetAuthorById(Guid guid); + +// 获取所有作者的方法 +ICollection<实例对象> GetAllAuthors(); +``` + +#### 实例名Repository +```c# +public class 实例名Repository : I实例名Repository +{ + public ICollection<实例名> GetAllAuthors() + { + // 从持久化数据库中获取 + return 名Db.Instance.实例名.ToList(); + // return [.. 名Db.Instance.实例名]; + } + + public 实例名? GetAuthorById(Guid guid) + { + return 名Db.Instance.实例名.SingleOrDefault(item => item.Id == guid); + } +} +``` + +#### 控制器 +```c# +private readonly I实例名Repository _实例名Repository; + +public 实例名Controller(I实例名Repository 实例名Repository) +{ + _实例名Repository = 实例名Repository; +} + +// 在Get函数中获取数据 +[HttpGet("{id?}")] +public IActionResult Get(int id) +{ + if (id.ToString() == "") + { + return Ok(_实例名Repository.GetAllAuthors()); + } + else + { + return Ok(_实例名Repository.GetAuthorById(id)); + } +} +``` + +#### Startup.cs +```c# +public void ConfigureServices(IServiceCollection services) +{ + services.AddControllers(); + // 新增 + services.AddScoped(); +} +``` + -- Gitee