diff --git "a/\351\273\204\345\244\251\344\274\237/20240527-\350\267\257\347\224\261.md" "b/\351\273\204\345\244\251\344\274\237/20240527-\350\267\257\347\224\261.md" new file mode 100644 index 0000000000000000000000000000000000000000..5e04b47144729384aeefa37c936239746c7756c0 --- /dev/null +++ "b/\351\273\204\345\244\251\344\274\237/20240527-\350\267\257\347\224\261.md" @@ -0,0 +1,55 @@ +### 路由是什么? +路由是指将用户请求映射到特定的处理程序(如控制器的操作方法)的过程。 + +### 作用 +- 请求分发:路由决定了如何将传入的 HTTP 请求分发给相应的控制器和操作方法。 + +- URL 映射:路由将请求的 URL 映射到特定的控制器和操作方法,以便执行相应的业务逻辑。 + +- RESTful 设计:通过定义符合 RESTful 架构风格的路由模板,可以创建清晰、易懂的 API 接口。 + +- 参数传递:路由模板中的参数可以从 URL 中提取值,并将其传递给控制器操作方法进行处理。 + +- 路由优先级:当定义多个路由时,路由系统会根据路由的顺序选择最佳匹配,确保正确的路由被执行。 + +- 路由配置:在框架中通常有路由配置文件,您可以在其中定义路由模板、默认路由和约束等。 + +### 示例 +```c# +[Route("/api/[controller]")] //定义控制器的路由前缀, +// 例如以下示例定义了BlogsController的控制器路由前缀为/api/blogs +public class BlogsController : ControllerBase +{ + // 处理对/blogs的GET请求 + public IActionResult Index(){ + return Ok("999"); //返回一个包含字符串"999"的200 OK响应 + } + + [Route("{id}")] //定义Single方法的路由模板 + // 处理对/blogs/{id}的GET请求,接受一个整型参数id + public IActionResult Single(int id) + { + return Ok(id); //返回一个包含id值的200 OK响应 + } +} + +// 上面两个函数可以合并写为以下形式: + [Route("{id?}")] + public IActionResult Index(){ + // 代码块 + } + public IActionResult Single(int id) + { + // 代码块 + } +``` + +### Action特性 +- [FromQuery]:从HTTP请求的查询字符串中获取参数的值 +- [FromForm]:从表单中获取参数的值 +- [FromHeader]:从HTTP 请求的头部信息中获取参数值 +- [FromBody]:从请求的内容体获取参数值 +- [FromServices]:从依赖注入容器中获取参数值 +- [FromRoute]:从路由中获取参数值 +- [BindRequiredAttribute]:如果没有值绑定到此参数,或绑定不成功,这个特性将添加一个ModelState错误 +- [ApiController]:特性标记的控制器会自动验证请求体中的参数,并返回适当的 HTTP 响应 \ No newline at end of file diff --git "a/\351\273\204\345\244\251\344\274\237/20240528-\350\277\207\346\273\244\345\231\250.md" "b/\351\273\204\345\244\251\344\274\237/20240528-\350\277\207\346\273\244\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..0325c6051f7e4001ed902c2f98a3ad4f61b8ebec --- /dev/null +++ "b/\351\273\204\345\244\251\344\274\237/20240528-\350\277\207\346\273\244\345\231\250.md" @@ -0,0 +1,59 @@ +在 ASP.NET Web API 中,过滤器(Filters)是一种机制,用于在请求处理过程中执行一些特定的逻辑。过滤器可以用于全局范围、控制器范围或动作方法范围,以实现各种功能,如日志记录、异常处理、身份验证、授权等。 + +### 类型: + +1. **授权过滤器(Authorization Filters)**:用于在执行操作方法之前或之后执行授权逻辑,控制是否允许请求执行。 + +2. **动作过滤器(Action Filters)**:在执行操作方法之前或之后执行逻辑,可以用于日志记录、性能监视等。 + +3. **结果过滤器(Result Filters)**:在执行操作方法之后、结果返回给客户端之前执行逻辑,可以修改返回结果。 + +4. **异常过滤器(Exception Filters)**:在发生异常时执行逻辑,可以用于全局异常处理、日志记录等。 + +5. **资源过滤器(Resource Filters)**:在执行操作方法之前或之后执行逻辑,但在结果被执行之前,通常用于资源清理等。 + +### 使用方法: + +1. **全局过滤器**:在 `WebApiConfig` 或 `Startup` 类中注册全局过滤器,以应用到整个应用程序。 + +2. **控制器范围过滤器**:使用特性在控制器类上标记过滤器,使其仅应用于该控制器。 + +3. **动作方法范围过滤器**:使用特性在动作方法上标记过滤器,使其仅应用于该动作方法。 + +### 示例: + +```csharp +public class LogActionFilter : ActionFilterAttribute +{ + public override void OnActionExecuting(HttpActionContext actionContext) + { + // 在执行动作方法之前执行的逻辑 + Log("Action is executing"); + } + + public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) + { + // 在执行动作方法之后执行的逻辑 + Log("Action is executed"); + } + + private void Log(string message) + { + // 日志记录逻辑 + } +} + +[LogActionFilter] +public class ProductsController : ApiController +{ + [HttpGet] + public IHttpActionResult GetProducts() + { + // 返回产品列表 + } +} +``` + +**在上面的示例中,`LogActionFilter` 是一个自定义的动作过滤器,用于记录日志。通过在 `ProductsController` 控制器上应用 `[LogActionFilter]` 特性,使得日志记录逻辑会在执行该控制器中的动作方法之前和之后执行。** + +**通过合理使用过滤器,可以实现更多的功能,如日志记录、异常处理、性能监视、授权控制等,从而提高应用程序的可维护性和可扩展性。** \ No newline at end of file diff --git "a/\351\273\204\345\244\251\344\274\237/20240530-\345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\2371.md" "b/\351\273\204\345\244\251\344\274\237/20240530-\345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\2371.md" new file mode 100644 index 0000000000000000000000000000000000000000..ca1170b0c6e7ed24cee3ed914185ad2f81183348 --- /dev/null +++ "b/\351\273\204\345\244\251\344\274\237/20240530-\345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\2371.md" @@ -0,0 +1,39 @@ +# 一、项目设计 +## 一、主体结构 +1. Resultfull风格的WebApi +2. Asp.net core 8.0 +3. 采用传统控制器模式 + +## 二、模型设计(例如:图书管理系统) +### 1.作者表Authors +1. 姓名 AuthorName +2. 性别 Gender +3. 出生年月 Birthday +### 2.图书表Books +1. 书名BookName +2. 出版社Publiser +3. 作者AuthorId +4. 价格Price + +## 三、内存型数据库(自定义的一个集合类) +在应用程序中定义一个类,专门提供模拟数据 + +## 四、仓储系统(准备用来接入数据库的一套接口) +### 1.通用型仓储接口 +定义了通用的数据存取操作方法,例如增删改查 +### 2.个性化的仓储接口 +针对特定业务需求而定义的数据存取接口,通常继承自通用型仓储接口,通过扩展通用接口来实现特定业务需求的操作 + +## 五、利用主体结构,具体实现Resultfull风格的关于两个表的CRUD +### 1.作者表 +- 获取作者列表 get/api/authors +- 获取指定作者 get/api/authors/29 +- 新增作者信息 post/api/authors +- 修改作者信息 put/api/authors/29 +- 删除作者信息 delete/api/authors/29 +### 2.图书表-部署于作者表底下 +- 获取图书列表 get/api/authors/9/books +- 获取指定图书 get/api/authors/9/books/29 +- 新增图书信息 post/api/authors/9/books +- 修改图书信息 put/api/authors/9/books/29 +- 删除图书信息 delete/api/authors/9/books/29 diff --git "a/\351\273\204\345\244\251\344\274\237/20240531-\351\233\206\345\220\210\346\216\245\345\217\243md" "b/\351\273\204\345\244\251\344\274\237/20240531-\351\233\206\345\220\210\346\216\245\345\217\243md" new file mode 100644 index 0000000000000000000000000000000000000000..33ebeb5f66ee116bb95b29a1275065178c0ea7d6 --- /dev/null +++ "b/\351\273\204\345\244\251\344\274\237/20240531-\351\233\206\345\220\210\346\216\245\345\217\243md" @@ -0,0 +1,63 @@ +### 集合接口 +- ICollection :ICollection接口由泛型集合类实现。使用这个接口可以获得集合中的元素个数(Conunt()),还可以从集合中添加和删除元素(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