中间件

06-课程重点ASP.NET CORE介绍

ASP.NET CORE是基于.NET CORE,就好比我们以前的ASP.NET 基于.NET。只不过 带有ASP.*** 那么就是用来开发WEB应用的。它的架构上和以前有点不一样,另外 它不再基于system.web.dll 这些。

统一的构建方式

配置简单 适用于云程序

本身就带依赖注入

轻量级 模块化的HTTP请求管道

完全以nuget包的形式发布

跨平台运行

ASP.NET CORE应用

我们看一下代码 它和以前的asp.net项目有点不一样,他是有Program.cs 的 里面也有main方法。所以 ASP.NET CORE应用 其实就是一个控制台程序 只不过是这个控制台的main方法中 创建一个web应用。

Startup类似以前的global文件,它做一些初始化 和注册一些中间件 已经服务。

Configure: This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 就是这个在启动的时候被调用 使用这个方法去配置HTTP请求管道。

ConfigureServices: This method gets called by the runtime. Use this method to add services to the container. 这个方法也是运行的时候被调用 使用这个方法 可以给容器加入服务。

asp.net core是一个控制台程序?

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}Code language: PHP (php)

CreateDefaultBuilder 创建一个默认的Builder,通过这个builder 可以定义web服务器和startup。

UseStartup方法指定应用的startup类,startup类用于定义请求处理管道和配置应用需要的服务,它必须是公开的。

public class Startup
{
    //定义我们的应用使用的服务器 我这里是mvc
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }
    
    //定义我们请求管道的中间件
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    }
}Code language: PHP (php)

IOC服务

服务是应用中用于通用调用的组件,服务通过依赖注入获取并使用。ASP.NET CORE内置了一个IOC控制反转容器,默认支持构造器注入 可以很方便替换为我们自己的IOC容器。因为使用了DI 依赖注入 所以我们在整个应用都都可以使用服务 比如我们的日志服务 Logging。

07-理解中间件的原理和自定义中间件

Configure方法之后执行一次 就是程序启动的时候。中间件是一个类 ,这些类加入到管道,这些中间件是有顺序的是 从上到下。这些中间件 可以把 工作交给下一个中间件 也可以结束执行,可以使用中间件请求处理管道。中间件是一个HttpContext执行异步逻辑,在Configure方法调用IApplicationBuilder的一个对应的UserXYZ扩展方法。

ASP.NET CORE本身有丰富的中间件:静态文件 路由 身份认证等。当然我们也可以自定义中间件 后面我们来介绍。

asp.net core 本身级有一些中间件,自定义中间件去理解。中间件就好比往这个HTTP管道里面 插入一些方法 这些方法 加到了管道流(函数链-委托)他就会一个个的排队执行。那么我们的中间件的方法 可以选择交给下一个中间件 如果不交的话 那么久相当于直接直接处理完了 就返回去了。

添加一个类 作为中间件

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MvcDemo
{
    public class AMiddleware
    {
        private RequestDelegate _next;

        /// <summary>
        /// 管道执行到达我们的中间件的时候 从上一个中间件 接收到RequestDelegate 委托
        /// </summary>
        /// <param name="next"></param>
        public AMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        /// <summary>
        /// 给HTTP请求管道 加入业务进去
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            //await _next.Invoke(context);
            await context.Response.WriteAsync("AMiddleware<BR/>");
            await _next(context);//交给下一个中间件
            await context.Response.WriteAsync("AMiddleware<BR/>");
        }
    }
}Code language: JavaScript (javascript)

加一个扩展方法 来use这个中间件到我们的管道里面

/// <summary>
/// 用来注册我们的中间件的扩展方法
/// </summary>
public static class MiddleWareExtensions
{
    /// <summary>
    ///  注册A中间件
    /// </summary>
    /// <param name="builder"></param>
    /// <returns></returns>
    public static IApplicationBuilder UseAMiddleWare(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<AMiddleware>();
    }
}Code language: PHP (php)

当然这个可以不用扩展方法,直接这样子 直接在configure里面 注册:app.UseMiddleware<AMiddleware>();

在configure方法里面 注入中间件

app.UseStaticFiles();

//往管道中加入我们的中间件
//app.Map("/", HandleHtml);
app.UseAMiddleWare();
app.UseBMiddleWare();
//app.UseCMiddleWare();
app.UseMiddleware<CMiddleware>();

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});Code language: JavaScript (javascript)

08-ConfigureServices配置服务容器-以依赖注入服务来举例AddSingleton

这个方法 可以配置很多东西 这里我们先提一下 后面再来解析,比如 配置数据库连接地址、配置MVC服务、配置依赖注入等等。

ASP.NET CORE依赖一个Http Server实现转发请求到应用程序中。转发的请求会以一组featuer接口的形式被包装,然后被应用程序组合到一个httpcontext中。ASP.NET CORE包含一个跨平台的web服务器 Kestrel。

configureservice有很多addxxx的方法(AddSingleton、AddScoped、AddTransient等重载),这些add方法 就算被服务容器 注入服务。后面我们会介绍一些用到的服务,接下来我们就来讲一个 依赖注入的使用。

演示一下 使用ConfigureService配置

namespace MvcDemo
{
    public interface ISend
    {
        void Execute();
    }
}

namespace MvcDemo
{
    public class SendEmail : ISend
    {
        public void Execute()
        {
            
        }
    }
}Code language: PHP (php)

然后再configureservice里面注册

services.AddSingleton<ISend, SendEmail>();Code language: HTML, XML (xml)

然后控制器里面 使用

namespace MvcDemo.Controllers
{
    public class HomeController : Controller
    {
        public ISend _send { get; set; }

        public HomeController(ISend send)
        {
            _send = send;
        }

        public IActionResult Index()
        {
            //ISend isd = new SendEmail();
            //isd.Execute();

            _send.Execute();
            return View();
        }
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注