• 第一次接触Core 6.0


    1.采用minimal API构件ASP.NET CORE程序

    RequestDelegate handler = context => context.Response.WriteAsync("Hello,World!"); //中间件委托
    WebApplicationBuilder builder = WebApplication.CreateBuilder(args);//通过静态工厂方法,创建应用程序构造类实例
    WebApplication app = builder.Build();//构建应用程序类
    app.Run(handler);//把handle中间件插入到应用程序管道内。
    app.Run();//启动应用程序


    // public delegate Task RequestDelegate(HttpContext context); RequestDeleate就是一个委托。

    2.一步创建WebApplication

    WebApplication app = WebApplication.Create(args);//直接通过应用程序类的静态工厂方法,创建对应的应用程序实例。
    app.Run(HandleAsync);
    app.Run();
    //这个的本质就是RequestDelegate委托
    static Task HandleAsync(HttpContext httpContext) => httpContext.Response.WriteAsync("Hello,World!1");

    3.构造应用程序之前就添加中间件

    WebApplication app = WebApplication.Create(args);
    IApplicationBuilder appBuilder = app;
    appBuilder.Use(HelloMiddleware).Use(WorldMiddleware);//Use方法把中间件添加到应用程序管道内(按先后顺序插入)。
    app.Run();
    
    static RequestDelegate HelloMiddleware(RequestDelegate next) =>
        async httpContext =>
        {
            await httpContext.Response.WriteAsync("Hello, ");
            await next(httpContext);
        };
    static RequestDelegate WorldMiddleware(RequestDelegate next) => async httpContext => await httpContext.Response.WriteAsync("World!");

    4.使用中间件变体委托

    WebApplication app = WebApplication.Create(args);
    IApplicationBuilder appBuilder = app;
    appBuilder.Use(HelloMiddleware).Use(WorldMiddleware);
    app.Run();
    
    static async Task HelloMiddleware(HttpContext httpContext, RequestDelegate next) //Q.这里的Next委托是怎么确定的?
    {
        await httpContext.Response.WriteAsync("Hello, ");
        await next(httpContext);
    };
    static async Task WorldMiddleware(HttpContext httpContext, RequestDelegate next) => await httpContext.Response.WriteAsync("World!"); //Q.这里的Next委托是怎么确定的?
    WebApplication app = WebApplication.Create(args);
    IApplicationBuilder appBuilder = app;
    appBuilder.Use(HelloMiddleware).Use(WorldMiddleware);
    app.Run();
    
    static async Task HelloMiddleware(HttpContext httpContext, Func<Task> next)  //Q.这里的Next委托是怎么确定的?  
    {
        await httpContext.Response.WriteAsync("Hello, ");
        await next();
    };
    static async Task WorldMiddleware(HttpContext httpContext, Func<Task> next) => await httpContext.Response.WriteAsync("World!");  //Q.这里的Next委托是怎么确定的?

    5.使用强类型中间件

    using APP;
    using Microsoft.Extensions.Options;
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSingleton<IGreeter, Greeter>().AddSingleton<GreetingMiddleware>(); //.Configure<GreetingOptions>(builder.Configuration.GetSection("greeting")); //依赖注入单例对象。
    var app = builder.Build();
    app.UseMiddleware<GreetingMiddleware>();
    app.Run();
    
    namespace APP
    {
        public interface IGreeter
        {
            string Greet(DateTimeOffset time);
        }
    
        public class Greeter : IGreeter
        {
            private readonly IConfiguration _configuration;
    
            public Greeter(IConfiguration configuration) => _configuration = configuration.GetSection("greeting");
            public string Greet(DateTimeOffset time) => time.Hour switch
            {
                var h when h >= 5 && h < 12 => _configuration["morning"],
                var h when h >= 12 && h < 17 => _configuration["afternoon"],
                _ => _configuration["evening"]
    
            };
        }public class GreetingMiddleware : IMiddleware
        {
            private readonly IGreeter _greeter;
            public GreetingMiddleware(IGreeter greeter) => _greeter = greeter;
            public Task InvokeAsync(HttpContext context, RequestDelegate next) => context.Response.WriteAsync(_greeter.Greet(DateTimeOffset.UtcNow));
        }
       

        public class GreetingOptions
        {
          public string Morning { get; set; }
          public string Afternoon { get; set; }
          public string Evening { get; set; }
        }

    
    }

    也可以改成下面的这种形式

        /// <summary>
        /// 也可以改写成下面这样,构造函数注入
        /// </summary>
        public class GreetingMiddleware //这里特别注意,我并没有实现IMiddleware,也是可以直接当成中间件来使用的。
        {
            private readonly IGreeter _greeter;
            public GreetingMiddleware(IGreeter greeter, RequestDelegate next) => _greeter = greeter;
            public Task InvokeAsync(HttpContext context) => context.Response.WriteAsync(_greeter.Greet(DateTimeOffset.UtcNow));
        }
    
        /// <summary>
        /// 也可以改成下面这样,方法注入
        /// </summary>
        public class GreetingMiddleware
        {
            public GreetingMiddleware(RequestDelegate next) { }
            public Task InvokeAsync(HttpContext context, IGreeter greeter) => context.Response.WriteAsync(greeter.Greet(DateTimeOffset.UtcNow));
        }

    知识点:
    RequestDelegate --中间件委托
    IMiddleware --中间件接口
    WebApplication --应用程序类,用于配置HTTP管道和Web应用程序。
    WebApplicationBuilder --应用程序类的建造者。
    HttpContext--当前上下文类(主要包含HttpRequest和HttpResponse属性)

    Microsoft.NET.Sdk --控制台应用程序
    Microsoft.NET.Sdk.Web --Web应用程序(挂载在控制台上)

    ImplicitUsings属性与C#10提供的一个叫做"全局命名空间"有关
    Nullable属性与一个名为"空值(null)验证"的特性有关。
    .NET6项目控制台,可以直接没有引用、命名空间和类的原因是与C#10提供的一个被"顶级语句(Top-level Statements)"的特性有关。

    中间件的定义要求
    中间件类型需要定义一个公共实例类型(静态类型无效),其构造函数可以注入任意的依赖服务看,单必须包含一个RequestDelegate类型的参数该参数表示由后续中间件构成的管道,当前中间件利用它将请求分发给后续管道作进一步处理。
    针对请求的处理实现在一个命名为InvokeAsync或者Invoke方法中,该方法返回类型为Task,第一个参数并绑定为当前的HttpContext上下文。

    参考链接

    https://www.cnblogs.com/artech/p/inside-asp-net-core-6-1.html#s101

  • 相关阅读:
    【spring】【转】Spring 框架的设计理念与设计模式分析
    【ML】贝叶斯估计
    【weka】Use weka in your java code
    【spring】spring的一些思想,哪些bean需要注入
    20130320
    【转】中文分词技术(中文分词原理)
    【ML】【GM】【转】图模型(graphical model, GM)的表示
    【hibernate】【转】Hibernate的一些使用技巧
    20130326
    【orange】【转】orange使用
  • 原文地址:https://www.cnblogs.com/luoluoluoD/p/15977489.html
Copyright © 2020-2023  润新知