前言

新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力。

新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马。

作者认为新人应该先打好基础,不要直接学习框架,例如先掌握 SQL 再使用 EFCore 框架。

作者只传授数年内不会变化的知识,让新手学习快速进入跑道受益终身。

分享使我快乐,请务必转发给同学,朋友,让大家都少走一些弯路!!


到此你已经初步掌握了 HTTP 协议,C# 语言基础知识,这一篇将带你进入 WebApi 服务器应用开发的环境。

对于 Web 服务端程序来讲,一般分两种请求内容,静态和动态:

  • 静态的内容比如 .html/.css/.jpg,他们一般会存放在固定的 web 目录之内
  • 动态的内容比如查询投票数量、发表博客文章

Asp.net core 框架入门

Asp.net core 框架,它是官方为数不多的优秀框架,其实蛮复杂不建议新手进行系统的全面学习,如果有条件甚至推荐先学习 expressjs 框架(nodejs)再来看 Asp.net core 会简单很多。

创建一个 WebApi 程序很简单,在控制台使用命令:

dotnet new webapi


然后你就可以 F5 运行项目了,快点打开 ide 试试吧!

  • AddControllers/MapControllers 应用 Controllers 目录下的控制台类
  • AddSwaggerGen/UseSwagger/UseSwaggerUI 应用 Swagger 接口管理器,你可以把它发给前端开发者,提供了哪些 HTTP 接口一目了然


Controller 控制器

  • WeatherForecastController 继承 ControllerBase
  • [Route("[controller]")] 注解指定 HTTP 请求的路径是 WeatherForecast
  • Get 方法 [HttpGet("GetWeatherForecast")] 指定 HTTP 请求的方法为 GET,最终请求的路径是 WeatherForecast/GetWeatherForecast
  • Get 方法返回值最终被序列化成 Json 格式返回给浏览器


思考:如果使用 [HttpPost] 是不是指定方法为 POST?

[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
}; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
} [HttpGet("GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

之前讲 HTTP 协议时,有讲到 QueryString、Form、JSON 三种请求报文的参数格式,服务器获取参数的办法:

    [HttpGet("QueryString")]
public string QueryStringTest([FromQuery] int id, [FromQuery] string wd)
{
return id.ToString() + ", " + wd;
} [HttpPost("Form")]
public string FormTest([FromForm] int id, [FromForm] string wd)
{
return id.ToString() + ", " + wd;
} [HttpPost("JSON")]
public string JsonTest([FromBody] JsonTestInputModel json)
{
return json.id.ToString() + ", " + json.wd;
}
class JsonTestInputModel
{
public int id { get; set; }
public string wd { get; set; }
}

关于异步,建议先把同步熟练之后再学习不迟,混起来学机制不明白还容易乱用。


什么是依赖注入(Denpendency Injection)

到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control),DI等概念搞晕。

1、首先我们得知道什么是依赖

当一个类需要另一个类协作来完成工作的时候就产生了依赖。比如我们在AccountController这个控制器需要完成和用户相关的注册、登录 等事情。其中的登录我们由EF结合Idnetity来完成,所以我们封装了一个EFLoginService。这里AccountController就有一个ILoginService的依赖。

2、什么是注入

注入体现的是一个IOC(控制反转的的思想)。在反转之前 ,我们先看看正转。

private ILoginService<ApplicationUser> _loginService;
public AccountController()
{
_loginService = new EFLoginService()
}

大师说,这样不好。你不应该自己创建它,而是应该由你的调用者给你。于是你通过构造函数让外界把这两个依赖传给你。

private ILoginService<ApplicationUser> _loginService;
public AccountController(ILoginService<ApplicationUser> loginService)
{
_loginService = loginService;
}

把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入。

3、为什么要反转?

为了在业务变化的时候尽少改动代码可能造成的问题。比如我们现在要把从EF中去验证登录改为从Redis去读,于是我们加了一个 RedisLoginService。这个时候我们只需要在原来注入的地方改一下就可以了。

因为EFLoginService和RedisLoginService都实现了接口ILoginService,所以我们直接在调用方传入RedisLoginService即可。(即将EFLoginService替换为RedisLoginService)

4、什么是容器?

上面我们在使用AccountController的时候,我们自己通过代码创建了一个ILoggingServce的实例。想象一下,一个系统中如果有100个这样的地方,我们是不是要在100个地方做这样的事情? 控制是反转了,依赖的创建也移交到了外部。现在的问题是依赖太多,我们需要一个地方统一管理系统中所有的依赖,所以容器诞生了。

容器负责两件事情:

  • 绑定服务与实例之间的关系
  • 获取实例,并对实例进行管理(创建与销毁)


Asp.net core DI

在.NET Core 中 DI 的核心分为两个组件:IServiceCollection和 IServiceProvider。

  • IServiceCollection 负责注册
  • IServiceProvider 负责提供实例
builder.Services
//.AddTransient<ILoginService, EFLoginService>() //每一次GetService都会创建一个新的实例
.AddScoped<ILoginService, EFLoginService>() //在同一个Scope内只初始化一个实例
//.AddSingleton<ILoginService, EFLoginService>(); //整个应用程序生命周期以内只创建一个实例

提示:每个 HTTP 请求都会创建一个 Scope 生命范围,所以 AddScoped 是最常用的方法。

public class WeatherForecastController : ControllerBase
{
private readonly ILoginService _loginService; public WeatherForecastController(ILoginService loginService)
{
_loginService = loginService;
}
}

中间件管道

app.Use(async (context, next) =>
{
Console.WriteLine("middleware1 : in");
await next.Invoke();
Console.WriteLine("middleware1 : out");
});
app.Use(async (context, next) =>
{
Console.WriteLine("middleware2 : in");
await next.Invoke();
Console.WriteLine("middleware2 : out");
});
app.Run(async context =>
{
Console.WriteLine("Hello World");
await context.Response.WriteAsync("Hello World");
});


Asp.net core 框架还有很多知识,但是对新手而已学到这里算入门了,千万不要指望一下能吃下所有内容(贪吃蛇的后果),只有反复的实战才能彻底领会贯通。

到这里,你已经对 Asp.net core 框架有了初步的认识,为我们以后深入打下了基础,下一篇我们学习 数据库 CRUD 增删改查 知识吧!


系列文章导航

原创保护,转载请注明出处:https://www.cnblogs.com/FreeSql/p/16782488.html

Asp.net core 少走弯路系列教程(七)WebApi 学习的更多相关文章

  1. 学习ASP.NET Core Razor 编程系列九——增加查询功能

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  2. 学习ASP.NET Core Razor 编程系列十九——分页

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Razor 编程系列十七——分组

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 学习ASP.NET Core Razor 编程系列十六——排序

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 学习ASP.NET Core Blazor编程系列十五——查询

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  7. 学习ASP.NET Core Blazor编程系列十六——排序

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  8. 学习ASP.NET Core Razor 编程系列八——并发处理

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  9. 学习ASP.NET Core Razor 编程系列十——添加新字段

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  10. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

随机推荐

  1. Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

    title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon e ...

  2. Apache Camel系列(4)----Akka Camel

    Akka是一个高性能,高容错的的分布式框架,并且对Camel也提供了很好的支持,下面创建一个Akka Camel的demo,运行环境:CentOS7 + IntelliJ + JDK8.这个demo分 ...

  3. 一键部署+限免体验!盘点如何在华为云上体验DeepSeek

    本文分享自华为云社区<一键部署+限免体验!盘点如何在华为云上体验DeepSeek>,作者:华为云社区精选. 还在为DeepSeek深度思考出现"服务器繁忙"而头疼?华为 ...

  4. Aspire+扣子智能体实现AI自动CodeReview

    一.引言 Code Review在软件开发中扮演着至关重要的角色,它不仅能够提升代码质量,确保代码的可维护性和一致性,还能促进团队成员之间的知识共享和技术提升. 传统的代码审查过程面临着诸多挑战和局限 ...

  5. [JXOI2017] 加法 题解

    最小值最大,考虑二分答案,问题转为判断最小值是否能 \(\ge x\). 假如 \(a_i\ge x\),那我们肯定不管:假如 \(a_i<x\),那最好能让选择的区间 \(r\) 值更大,用优 ...

  6. 莫托曼机器人GP110B操作手柄故障维修全攻略

     莫托曼机器人GP110B操作手柄故障机器人维修全攻略              一.前言              莫托曼机器人GP110B操作手柄是机器人控制系统的重要组成部分,它允许操作人员对机 ...

  7. 学习vue ,环境搭建(VS code、node.js、cnpm、vue-cli)创建项目 并引入element

    安装 1.Visual studio code(VS code) 往期博客:https://www.cnblogs.com/technicist/p/12677052.html 2.Node.js与c ...

  8. OpenLayers 绘制带箭头的LineString

    <!--******************************************************************** * Copyright 2000 - 2022 ...

  9. Vue 页面批量导入其他组件

    <template> <div> <template v-for="(item) in names"> <component :is=&q ...

  10. Ansible - [06] Playbook

    Playbook 概述 Ansible ad-hoc 可以通过命令行形式远程管理其他主机 适合执行一些临时性简单任务 Ansible playbook 中文名称叫 剧本 将经常需要执行的任务写入一个文 ...