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();

posted @ 2020-05-14 11:04  HKBlog  阅读(188)  评论(0编辑  收藏  举报