AspNetCore基础一
启动流程
- 创建主机生成器
- 配置主机
- 创建主机
- 启动主机
主机:
主机负责Web应用程序的启动和生存期管理,配置服务器、请求处理管道、日志等
主机实际上是封装了应用资源的对象
注册服务
- 服务通常在StartUp类的ConfigureServices方法中配置
服务大体分三类
- 内置服务
- 第三方服务
- 自定义服务
#region 内置服务
// 添加对控制器和API相关功能的支持 但不支持视图和页面 WEBAPI
//services.AddControllers();
//添加对控制器、API、视图相关功能的支持
//ASP.NET CORE 3.X MVC模板默认使用
//services.AddControllersWithViews();
//添加对Razor Pages和最小控制器的支持
//services.AddRazorPages();
//ASP.NET CORE 2.X MVC使用
//services.AddMvc();
//跨域支持
//services.AddCors()
#endregion
#region 第三方服务
//例如:EF Core 日志框架 Swagger (需要先引用第三方组件)
#endregion
#region 自定义服务
/*
服务生存周期:
- 瞬时 每次从服务容器里进行请求实例时 都会创建一个新的实例
- 作用域 线程单例 在同一个线程(请求)里 只实例化一次
- 单例 全局单例 每一次都是使用相同的实例
services.AddTransient()
services.AddScoped()
services.AddSingleton()
*/
//服务相同注册多个 只有后面的会生效
//services.AddSingleton<IMessageServices,EmailService>();
//services.AddSingleton<IMessageServices,SmsService>();
//services.AddMessage(p => p.UseEmail());
#endregion
自定义服务
- AddTransient
- AddScoped
- AddSingleton
简单实现
//声明一个消息服务接口
public interface IMessageServices
{
public string Send();
}
//实现接口
public class EmailService : IMessageServices
{
public string Send()
{
return "EMail";
}
}
public class SmsService : IMessageServices
{
public string Send()
{
return "Sms";
}
}
//一切就绪我们就可以通过下面的方式注册服务
//services.AddSingleton<IMessageServices,EmailService>();
//services.AddSingleton<IMessageServices,SmsService>();
//相同服务注册多个 只有后面的会生效
封装实现
public class MessageServiceBuilder
{
//服务集合
public IServiceCollection ServiceCollection { get; set; }
public MessageServiceBuilder(IServiceCollection services)
{
ServiceCollection = services;
}
public void UseEmail()
{
ServiceCollection.AddSingleton<IMessageServices, EmailService>();
}
public void UseSms()
{
ServiceCollection.AddSingleton<IMessageServices, SmsService>();
}
}
public static class MessageServiceExtension
{
public static void AddMessage(this IServiceCollection services,Action<MessageServiceBuilder> configure)
{
var builder = new MessageServiceBuilder(services);
configure(builder);
}
}
//接下来我们就可以通过AddXX的方式注册服务
services.AddMessage(p => p.UseEmail());
配置管道中间件
- 中间件通常在StartUp类的Configure方法中配置
配置中间件常见的两种方法
- Use 有Next 它能指向下一个中间件
- Run 没有Next 终端中间件 专门用来短路请求管道 是放在最后面的
自定义中间件
- UseMiddleware
简单实现
/// <summary>
/// 自定义中间件
/// </summary>
public class TestMiddleware
{
// 注册中间件时调用
private readonly RequestDelegate _next;
public TestMiddleware(RequestDelegate next)
{
_next = next;
}
/// <summary>
/// 中间件业务代码
/// 请求到达时调用
/// </summary>
/// <param name="httpContext">http上下文</param>
/// <returns></returns>
public async Task InvokeAsync(HttpContext httpContext)
{
//Http请求部分处理代码
await httpContext.Response.WriteAsync("Test Request\r\n");
await _next(httpContext);
//Http响应部分处理代码
await httpContext.Response.WriteAsync("Test Response\r\n");
}
}
//app.UseMiddleware<TestMiddleware>();
封装实现
public static class CustomMiddlewareExtensions
{
public static IApplicationBuilder UseTest(this IApplicationBuilder app)
{
return app.UseMiddleware<TestMiddleware>();
}
}
//app.UseTest();