From e4df441297d8379cc2e690064437809ce6d1d1fb Mon Sep 17 00:00:00 2001 From: 15959855625 <2575863563@qq.com> Date: Sun, 2 Jun 2024 21:29:33 +0800 Subject: [PATCH] WebAPI-third --- ...50\345\205\245\344\273\243\347\240\201.md" | 2 +- .../20240527-\350\267\257\347\224\261.md" | 62 +++++++++++++++ ...8-\350\277\207\346\273\244\345\231\250.md" | 66 ++++++++++++++++ ...30\346\225\260\346\215\256\345\272\223.md" | 76 +++++++++++++++++++ ...73\347\273\237\346\216\245\345\217\243.md" | 63 +++++++++++++++ 5 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 "\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md" create mode 100644 "\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md" create mode 100644 "\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md" create mode 100644 "\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md" diff --git "a/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md" "b/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md" index 9e8ed23..50d0fc3 100644 --- "a/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md" +++ "b/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md" @@ -30,7 +30,7 @@ public class Startup{ /// /// public void ConfigureServices(IServiceCollection services){ - // 添加了 MVC 控制器服务,这是 mvc 核心部分 + services.AddControllers(); } diff --git "a/\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md" "b/\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md" new file mode 100644 index 0000000..ad2a4e2 --- /dev/null +++ "b/\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md" @@ -0,0 +1,62 @@ +### 路由: +```c# +[ApiController].[Route("/api/..")] +``` + +### 关于匹配到函数的处理: +1. 入参:函数的参数,模型绑定 +2. 出参:返回的响应,1.状态码 2.带对象的状态码 3.重定向 4.内容 + + +```c# +Dto:BlogDto.cs + +namespace Admin2024.Api; + +public class BlogDto{ + public string Title {get;set;}=null!; + public string Author {get;set;}=null!; + public string? Flag {get;set;} + +} +``` + + +```c# +BlogsController.cs: +using Microsoft.AspNetCore.Mvc; + +namespace Admin2024.Api; + +[ApiController] +[Route("/api/[controller]")] + +public class BlogsController:ControllerBase{ +//创建 + public IActionResult Index(){ + return Ok("你好,世界"); + } + + [Route("{id}")] + public IActionResult Details(int id){ + return Ok(id); + } +//新增 + [HttpPost] + public ActionResult Post(BlogDto blogDto){ + return blogDto; + } +//编辑 + [HttpPut("{id}")] + public ActionResult PUT(int id,BlogDto blogDto){ + return new {id,blogDto}; + } +//删除 + [HttpDelete] + public IActionResult Delete(int id){ + return Ok(id); + } + + +} +``` \ No newline at end of file diff --git "a/\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md" "b/\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md" new file mode 100644 index 0000000..b04fb7f --- /dev/null +++ "b/\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md" @@ -0,0 +1,66 @@ +## 过滤器 +在.NET Web API中,过滤器(Filter)是一种用于拦截和处理HTTP请求和响应的机制。过滤器可以用于执行身份验证、授权、日志记录、异常处理等任务。以下是一些关于.NET Web API过滤器的基本概念和用法: +1. **过滤器类型**:Web API提供了几种不同类型的过滤器,包括: + - 授权过滤器(Authorization Filters):用于执行授权检查。 + - 动作过滤器(Action Filters):允许在执行动作之前或之后执行代码。 + - 异常过滤器(Exception Filters):用于处理异常。 + - 消息过滤器(Message Filters):用于读取或修改进入或离开的HTTP消息。 +2. **创建过滤器**:自定义过滤器是通过继承相应的基类来创建的。例如,创建一个动作过滤器需要继承ActionFilterAttribute类,并重写OnActionExecuting和OnActionExecuted方法。 +3. **过滤器的注册**:过滤器可以在全局级别、控制器级别或操作级别注册。全局过滤器通过HttpConfiguration.Filters.Add方法添加,控制器级别的过滤器通过在控制器类上使用属性来注册,操作级别的过滤器则通过在操作方法上使用属性来注册。 +4. **过滤器的执行顺序**:过滤器的执行顺序遵循一定的规则。在同一个作用域内,授权过滤器最先执行,然后是动作过滤器。对于授权过滤器和动作过滤器的OnActionExecuting方法,如果有多个过滤器,它们的执行顺序是全局 -> 控制器 -> 操作。对于异常过滤器和动作过滤器的OnActionExecuted方法,执行顺序则是操作 -> 控制器 -> 全局。 +5. **最小API中的过滤器**:在.NET 6或更高版本中,最小API(Minimal APIs)提供了一种更简洁的方式来注册和使用过滤器,通过使用MapMethods和MapFilter方法。 +6. **过滤器的使用场景**:过滤器可以用于多种场景,如日志记录、请求验证、响应修改、异常处理等,它们提供了一种灵活的方式来处理Web API中的常见任务。 + +### result 过滤器 +- Startup.cs +```c# + using Filters.Filter; + namespace Filters; + public class Startup + { + public void Configure(IApplicationBuilder app) + { + app.UseRouting(); + + app.UseEndpoints(Endpoint=>Endpoint.MapControllers()); + } + public void ConfigureServices(IServiceCollection services) + { + // 将result过滤器注入服务 + services.AddControllers(option =>{ + option.Filters.Add(); + }); + } + } +``` +- ApiResultFilter.cs +```c# +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +namespace Filters.Filter; +public class ApiResultFilter : IAsyncActionFilter +{ + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + // 参数 context 表示动作执行的上下文,它包含了请求的详细信息和动作执行的结果。 + // 参数 next 是一个委托,用于执行管道中的下一个动作或过滤器。 + // context 已经被隐式地使用了 + var result = await next(); + // 判断返回的结果是否为内容,我们就给context.Result赋一个新的实例对象 ApiRuilt + if (result.Result is ObjectResult objectResult) + { + result.Result = new ObjectResult(new ApiResult + { + Code = 1000, + Msg = "请求成功!", + Data = objectResult.Value + }); + } + else + { + result.Result = new ObjectResult(new ApiResult { Code = 1001 }); + } + + } +} +``` diff --git "a/\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md" "b/\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000..ead656a --- /dev/null +++ "b/\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,76 @@ +## 资源管理 +```c# +一.主体结构: + ①:Resultfull风格的webAApi + ②:Asp.net Core 8.0 + ③:采用传统控制器模式 + +二. 模型设计(图书管理系统) + 作者:(Authors) + 姓名:AuthorName + 性别:Gender + 出生年月:Birthday + + 图书: + 书名:BookName + 出版社:Publister + 作者:AuthorId + 价格:Price + +三.内存型数据库(自定义的一个集合类) + +四.仓储系统(准备用来接入数据库的一套接口) + ①:通用型仓储接口 + ②:个性化的仓储系统(作者的增删改查,图书的增删改查) + +五.利用第一步的主体结构,具体实现Resultfull风格的关于作者,图书的CRUD +``` + +### 内存型数据库 +- BookStoreDb.cs +```c# +using Library.Modal; +namespace Library.Db; + +// 模拟数据库 +// 内存型数据库 - 自定义的一个集合类 +public class BookStoreDb +{ + // 数据库具体的实例 + public static BookStoreDb InstanceDb { get; set; } = new BookStoreDb(); + // 模拟数据库中的表 + public ICollection Author {get;set;} = new List(); + public ICollection Books {get;set;} = new List(); +} +``` +- Modal + - Author.cs + ```c# + using System.ComponentModel.DataAnnotations; + namespace Library.Modal; + + public class Author + { + [Required] + public int AuthorId {get;set;} + public string AuthorName {get;set;} = null!; + public int? Age {get;set;} + public int? Sex {get;set;} + public int? Phone{get;set;} + } + ``` + - Book.cs + ```c# + using System.ComponentModel.DataAnnotations; + namespace Library.Modal; + + public class Books + { + [Required] + public int BookId {get;set;} + public string BookName {get;set;} = null!; + public string? Publish {get;set;} + public string? Type {get;set;} + public int? Price{get;set;} + } + ``` \ No newline at end of file diff --git "a/\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md" "b/\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md" new file mode 100644 index 0000000..f3e3ae6 --- /dev/null +++ "b/\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md" @@ -0,0 +1,63 @@ +### 集合接口 +- ICollection :ICollection接口由泛型集合类实现。使用这个接口可以获得集合中的元素个数(Count()),还可以从集合中添加和删除元素(Add()、Remove()、Clear())、把集合复制到数组中(CopyTo()方法) +- IList :IList接口由于可通过位置访问其中的元素列表,这个接口定义了一个索引器,可以在集合的指定位置插入或者删除某些项(Insert()和RemovcAt()方法)。ILst接口派生自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(); + } +``` \ No newline at end of file -- Gitee