网站优秀网站地址专业团队英文

web/2025/10/7 12:18:45/文章来源:
网站优秀网站地址,专业团队英文,wordpress主题怎么汉化,php在网站开发中的作用老A说的一句话让我很受启发#xff0c;想要深入了解框架#xff0c;你要把精力聚焦在架构设计的层面来思考问题。而透彻了解底层原理#xff0c;最好的笨办法就是根据原理对框架核心进行重建或者说再造。看起来没有捷径#xff0c;也是最快的捷径。相信很多读者已经看过老A… 老A说的一句话让我很受启发想要深入了解框架你要把精力聚焦在架构设计的层面来思考问题。而透彻了解底层原理最好的笨办法就是根据原理对框架核心进行重建或者说再造。看起来没有捷径也是最快的捷径。  相信很多读者已经看过老A写的这篇文章《200行代码7个对象——让你了解ASP.NET Core框架的本质》这是一篇模仿和重建的典范。重建说白了就是模仿模仿有一个前置条件就是你对底层原理要烂熟于心。否则画虎难画骨原本要画虎最后出来的是只猫。要理解原理就要去阅读源码就像新人学开车如何使用尚且磕磕碰碰更何况让你去了解汽车的构造和引擎。  所以老A是引路人我像个门外汉一样对前辈的文章解读不下5遍。我有几个疑问1.为什么是7个对象2.这些对象如何分类如何排序3.这些对象发明的那个“无”是什么  在我深入学习和解读的时候我越加感觉到老A的这篇文章很值得去深入解读所谓知其然知其所以然这样在编码过程才会游刃有余以下开始我个人的解读。委托构建模式适配器模式public class Program{    public static void Main()     new WebHostBuilder()        .UseKestrel()        .Configure(app app.Use(context context.Response.WriteAsync(Hello World!)))        .Build()        .Run();}  以上是原文的代码我们可以看到WebHostBuilder、Server即Kestrel、ApplicationBuilder(即app)三大重要的对象如下图所示  WebHostBuilder这个父亲生出WebHost这个孩子WebHost又生成整个ASP.NET Core最核心的内容即由Server和中间件(Middleware)构成的管道Pipeline。我们看下Pipeline的放大图  继续把Pipeline拆开有个很重要的ApplicationBuilder对象里面包含Middleware、RequestDelegate。至于HttpContext是独立共享的对象贯穿在整个管道中间至此7大对象全部出场完毕。Configure是个什么玩意看下代码public IWebHostBuilder Configure(ActionIApplicationBuilder configure){    _configures.Add(configure);    return this;}  我们看到他是一个接受IApplicationBuilder的委托继续刨根问底IApplicationBuilder是什么玩意看下源码public interface IApplicationBuilder{    IApplicationBuilder Use(FuncRequestDelegate, RequestDelegate middleware);    RequestDelegate Build();}  他是一个注册中间件和生成Application的容器那么Application是什么呢源码没有这个对象但是看代码如下所示我们可以知道他是真正的委托执行者Handler执行是一个动作可以理解为app我猜想这是取名为ApplicationBuilder的原因。public RequestDelegate Build(){    _middlewares.Reverse();    return httpContext     {        RequestDelegate next _ { _.Response.StatusCode 404; return Task.CompletedTask; };        foreach (var middleware in _middlewares)        {            next middleware(next);        }        return next(httpContext);    };}  更详细的过程可以参考下面这张图(图片来源)  WebHostBuilder开始Build的那一刻开始WebHost被构造Server被指定Middlewares被指定等WebHost真正启动的时候Server开始监听收到请求后Middleware开始执行。到此一个完整的ASP.NET Core的流程就简单的走完了。接下来我们跟着老A一个一个对象的详细介绍。1.HttpContext这个对象应该是最容易理解的也是我们在编程时候遇到的最多的最重要的没有之一对象。请看这个对象的简要代码public class HttpContext{              public  HttpRequest Request { get; }    public  HttpResponse Response { get; }}public class HttpRequest{    public  Uri Url { get; }    public  NameValueCollection Headers { get; }    public  Stream Body { get; }}public class HttpResponse{    public  NameValueCollection Headers { get; }    public  Stream Body { get; }    public int StatusCode { get; set;}}  我们知道一个Http事务包括最核心的Request输入和Response输出所以HttpContext包含这两个核心的东西。  老A建议大家从管道的角度来理解该对象的作用管道和HTTP请求流程一脉相承。在Server接收到请求后HttpContext被创建。  在服务器和中间件中间件之间通过什么来传递信息就是共享上下文这个上下文就是HttpContext。可以说HttpContext是根据HTTP请求原理包裹的在管道之间的共享的一个上下文对象。  为什么这里要把HttpContext放在第一个来介绍因为这是一个最基础的对象。这7大对象的讲解顺序我感觉是从底层基础开始讲起再层层往上最后到WebHostBuilder。2.RequestDelegate  这个委托太重要了和HttpContext一样老A建议大家从管道的角度来理解这个委托。我们再复习一下管道的含义如图所示  这里的管道Pipeline Server Middlewares  还能更简单一点吗可以的如下图所示  这里的管道Pipeline Server HttpHandler。  多个Middlewares构成一个HttpHandler对象这是整个管道的核心那么应该如何用代码来表示呢  老A讲到“既然针对当前请求的所有输入和输出都通过HttpContext来表示那么HttpHandler就可以表示成一个ActionHttpContext对象”。  但是由于ASP.NET Core推崇异步编程所以你应该想得到Task对象那么HttpHandler自然就可以表示为一个FuncHttpContextTask对象。由于这个委托对象实在太重要了所以我们将它定义成一个独立的类型。下图展示的就是整个RequestDelegate的设计思路1public delegate Task RequestDelegate(HttpContext context);  这就是委托的由来为什么是委托而不是别的函数  委托是架构设计的底层技术非常常见。因为委托可以承载约定的函数遵循开闭原则能很好的把扩展对外进行开放保证了底层架构的稳定性。3.Middleware  这个对象比较费解。根据源码我们知道Middleware也是一个委托对象代码如下所示中间件其实就是一个FuncRequestDelegate, RequestDelegate对象1private readonly ListFuncRequestDelegate, RequestDelegate _middlewares  new ListFuncRequestDelegate, RequestDelegate();  该对象的输入和输入都是RequestDelegate为什么要这么设计呢我们想一下当前中间件处理完成后需要将请求分发给后续中间件进行处理他如何让后续的中间件参与当前的请求呢所以他必须要拿到代表后续中间件管道构成的那个Handler。如下图所示也就是说后续三个中间件构成的管道就是一个输入执行完毕后当前中间件也将被“融入”这个管道此时该新管道就会由四个中间件构成的一个委托链然后再输出给你由所有的中间件构成的新管道。如下图所示4.ApplicationBuilder  这又是一个builder可见builder模式在ASP.NET Core有非常广泛的应用。但是该Builder构建的不是Application到构建什么内容呢从下面代码声明我们可以看到他有两个功能。  从Use的使用来看第一个功能是注册器他把一个个中间件串联成一个管道。public interface  IApplicationBuilder{    IApplicationBuilder Use(FuncRequestDelegate, RequestDelegate middleware);    RequestDelegate Build();}  第二个功能是Build如下所示public class ApplicationBuilder : IApplicationBuilder{    private readonly ListFuncRequestDelegate, RequestDelegate _middlewares  new ListFuncRequestDelegate, RequestDelegate();    public RequestDelegate Build()    {        _middlewares.Reverse();        return httpContext         {            RequestDelegate next _ { _.Response.StatusCode 404; return Task.CompletedTask; };            foreach (var middleware in _middlewares)            {                next middleware(next);            }            return next(httpContext);        };    }    public IApplicationBuilder Use(FuncRequestDelegate, RequestDelegate middleware)    {        _middlewares.Add(middleware);        return this;    }}  Build真正做的事情是循环组装中间件最后把组装好的委托链进行返回。从_middlewares.Reverse();我们又可以知道对于委托链来说中间件的注册顺序和执行顺序是相反的这里需要进行反转然后才能保证先注册的中间件先执行。5.ServerServer对象相对比较简单我们看下他的接口定义public interface IServer{    Task StartAsync(RequestDelegate handler);}  我们可以看到Server有个启动函数StartAsyncStartAsync内部封装了RequestDelegate中间件同时内部也会new一个HttpContext(features)这样Server、RequestDelegate、HttpContext三者就全部聚齐了。public class HttpListenerServer : IServer{    private readonly HttpListener _httpListener;    private readonly string[] _urls;    public HttpListenerServer(params string[] urls)    {        _httpListener  new HttpListener();        _urls urls.Any()?urls: new string[] { http://localhost:5000/};    }    public async Task StartAsync(RequestDelegate handler)    {        Array.ForEach(_urls, url _httpListener.Prefixes.Add(url));           _httpListener.Start();        Console.WriteLine(Server started and is listening on: {0}, string.Join(;, _urls));        while (true)        {            var listenerContext await _httpListener.GetContextAsync();         Console.WriteLine({0} {1} HTTP/{2},                    listenerContext.Request.HttpMethod,                    listenerContext.Request.RawUrl,                    listenerContext.Request.ProtocolVersion);                var feature  new HttpListenerFeature(listenerContext);                var features  new FeatureCollection()                    .SetIHttpRequestFeature(feature)                    .SetIHttpResponseFeature(feature);                var httpContext  new HttpContext(features);                Console.WriteLine([Info]: Server process one HTTP request start.);                await handler(httpContext);                Console.WriteLine([Info]: Server process one HTTP request end.);                listenerContext.Response.Close();        }    }}public static partial class Extensions{    public static IWebHostBuilder UseHttpListener(this IWebHostBuilder builder, params string[] urls)     builder.UseServer(new HttpListenerServer(urls));  通过以上代码分析我们可以画个图做总结适配器模式由于ASP.NET Core可以支持不同的WebServer比如Kestrel和IIS不同的WebServer返回的HttpContext各不相同所以这里又增加了一个中间层进行适配。这个中间层是什么呢如下图所示就是IRequestFeature和IResponseFeature。这一层是典型的适配器模式。  这里重点讲解的7大对象这个适配器模式的实现细节暂且略过。 6.WebHostpublic interface IWebHost{    Task StartAsync();}  根据这段定义我们只能知道简单知道WebHost只要是用来启动什么对象用的具体什么对象似乎都可以。直到我们看了实现如下代码所示public class WebHost : IWebHost{    private readonly IServer _server;    private readonly RequestDelegate _handler;    public WebHost(IServer server, RequestDelegate handler)    {        _server server;        _handler handler;    }    public Task StartAsync() _server.StartAsync(_handler);}  通过StartAsync我们知道WebHost是用来启动管道的中间件的管道是在作为应用宿主的WebHost对象启动的时候被构建出来的。  而WebHost是如何被创建的呢接下来就要讲他的父亲WebHostBuilder7.WebHostBuilderpublic class WebHostBuilder : IWebHostBuilder{    private IServer _server;    private readonly ListActionIApplicationBuilder _configures  new ListActionIApplicationBuilder();      public IWebHostBuilder Configure(ActionIApplicationBuilder configure)    {        _configures.Add(configure);        return this;    }    public IWebHostBuilder UseServer(IServer server)    {        _server server;        return this;    }      public IWebHost Build()    {        var builder  new ApplicationBuilder();        foreach (var configure in _configures)        {            configure(builder);        }        return new WebHost(_server, builder.Build());    }}  我们看到该对象有个Build方法内部返回一个WebHost对象这就是父亲的职责负责生娃他的娃就是WebHost。生出来的时候给孩子一个ApplicationBuilder作为食物。而这个食物其实是包裹起来的展开来看就是一个个RequestDelegate委托链。public interface IWebHostBuilder{    IWebHostBuilder UseServer(IServer server);    IWebHostBuilder Configure(ActionIApplicationBuilder configure);    IWebHost Build();}  父亲除了创建WebHost之外他还提供了注册服务器的UseServer方法和用来注册中间件的Configure方法。说到Configure方法我们一定还记得ApplicationBuilder方法的Use也是一个注册器。这两个注册器有何不同呢我们对比一下代码WebHostBuilderpublic IWebHostBuilder Configure(ActionIApplicationBuilder configure){    _configures.Add(configure);    return this;}ApplicationBuilderpublic IApplicationBuilder Use(FuncRequestDelegate, RequestDelegate middleware){    _middlewares.Add(middleware);    return this;}  其中Use只是增加一个中间件Configure输入的是中间件构成的委托链。我们看下入口函数的代码就知道了public static async Task Main(){    await new WebHostBuilder()        .UseHttpListener()        .Configure(app app            .Use(FooMiddleware)            .Use(BarMiddleware)            .Use(BazMiddleware))        .Build()        .StartAsync();}参加文章深入研究 Mini ASP.NET Core一个Mini的ASP.NET Core框架的实现200行代码7个对象——让你了解ASP.NET Core框架的本质原文地址https://www.cnblogs.com/jackyfei/p/10838586.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

没有备案号的网站中铁建设集团集采网站

100. 相同的树 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入: p [1,2,3], q [1,2,3] 输出&#xff1…

沭阳城乡建设局网站怎么看网站做的好不好

洗鞋店小程序,干洗店软件,洗护行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发,成品软件开发 洗衣工厂软件、功能强大! 包含以下主要功能: * 用户选择洗护用品&#x…

网站续费会计分录怎样做百度域名注册查询

把可能的进行二分判断&#xff0c;判断的时候尽量向右取&#xff0c;一直取到不能去为止&#xff0c;这样才有可能成功分割。 判断是否可以把up作为最大值的代码&#xff1a; bool judge(LL up){if(up < Big) return false; //Big是数组中最大值&#xff0c;如果up小于最大值…

网站备案有哪些费用网络科技公司企业文化

单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”&#xff0c;按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例&#xff0c;如果创建出了多个实例&#xff0c;就会编译报错。而不会创建出多个实…

别人网站 自己的二级域名受雇去建设网站类网站

在 QML 中&#xff0c;Column 和 Row 是常用的布局元素&#xff0c;用于水平&#xff08;Row&#xff09;和垂直&#xff08;Column&#xff09;排列它们的子元素。以下是这两个元素的主要属性列表&#xff1a; Column 属性 spacing: 子元素之间的垂直间隔。width 和 height:…

人防网站建设与服务济宁那家做网站最好

[算法日志]图论刷题: 沉岛思想的运用 leetcode 695 岛屿最大面积 给你一个大小为 m x n 的二进制矩阵 grid . 岛屿 是由一些相邻的 1 (代表土地) 构成的组合, 这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻. 你可以假设 grid 的四个边缘都被 0&#xff08…

网站当地备案企业网站建设结论

想象一下,一家公司在芬兰 Google Cloud 数据中心的服务器上托管一个网站。对于欧洲用户来说,加载可能需要大约 100 毫秒,但对于墨西哥用户来说,加载需要 3-5 秒。幸运的是,有一些策略可以最大限度地减少远程用户的请求延迟。 这些策略称为缓存和内容交付网络 (CDN),它们是…

网站后台文章字体什么2007做视频网站

目录 网络Internet &#xff08;互联网或互连网&#xff09;Internet&#xff08;因特网&#xff09;待续、更新中 网络 指将分布在不同地理位置的、相同或不同类型的网络通过网络互连设备&#xff08;中继器、网桥、路由器或网关等&#xff09;相互连接&#xff0c;形成一个范…

交易类网站建设功能表怎么下载网站动态图片

1、什么是内存对齐 计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小 #include <stdio.h> struct A {char a;int b; };int main() {printf("size of struct A is %d\n", sizeo…

做网站公司还有没有活路dedecms做中英文网站

Swin UNetR&#xff1a;把 UNet 和 Swin Transformer 结合 网络结构使用指南 前置知识&#xff1a;Swin Transformer&#xff1a;将卷积网络和 Transformer 结合 Swin UNetR 结合 Swin Transformer 的上下文建模能力和 U-Net 的像素级别预测能力&#xff0c;提高语义分割任务的…

温州中豪网站建设推广全国最大房产网络平台

简介 前面介绍了scanner可以扫描某个包路径下的所有bean&#xff0c;我们最常用的也是通过ComponentScan指定包路径去扫描&#xff0c;在SpringBoot中也是如此&#xff0c;本文将介绍spring扫描的逻辑 BeanDefinitionRegistryPostProcessor 知道了ComponentScan的作用&#…

深圳市盐田区住房和建设局网站正安县网站seo优化排名

文章目录题目描述解析代码题目描述 解析 第一感觉&#xff1a;啥都没感觉出来。。。 直接拿动态规划高精做的 但是只能拿40 重新分析一下这道题&#xff1a; g&#xff08;x&#xff09;首先可以拿快速幂很容易的求出来 问题就转化为了**把g(x)个东西分成k份的方案数 其实答案…

网站推广推广WordPress显示403

初涉的话先留坑吧 题目大意 $\sum_{i_1}^{a_1}\sum_{i_2}^{a_2}\cdots\sum_{i_m}^{a_m}(i_1,i_2,\cdots,i_m)$ $a_i<1e6,2<m<10$ 题目分析 首先寄存两篇比较好的博客&#xff1a; 1.铃悬的数学小讲堂——狄利克雷卷积与莫比乌斯反演 2.[学习笔记]莫比乌斯反演常见模型…

php 企业网站模板开发者门户网站是什么意思

1. 竞争市场 1.1. 算法、大数据、超级平台的风起云涌似乎预示了市场竞争机制的加速终结&#xff0c;而我们似乎也对这种市场机制的衰退见怪不怪 1.1.1. 它有效节省了消费者的搜寻成本&#xff0c;降低了市场准入壁垒&#xff0c;开辟了市场扩张与准入之间的崭新通道&#xff…

网站建设的作用和意义中小型企业网搭建

一般用下面的方法可以解决: 1&#xff1a;确认在“配置属性”中的“启用ASP.NET调试"为"True" 2&#xff1a;确认你的"web.config"中的"debugtrue" 3&#xff1a;若你安装过Win2000 SP4后&#xff0c;则要在命令行执行"regsvr32 i asp…

phpwind能做网站吗域名批量注册查询

用HBuider写的Web项目&#xff0c;项目名如果包含中文&#xff0c;edge下无法显示图片转载于:https://www.cnblogs.com/phoenixBlog/p/9964820.html

建网站 xyz汉阳网站推广公司

哪些好用的AI绘画生成软件&#xff1f;随着人工智能技术的飞速发展&#xff0c;AI绘画生成软件逐渐走入大众的视野&#xff0c;为艺术创作领域带来了革命性的变革。今天&#xff0c;就让我们一起探索四款备受推崇的AI绘画生成软件&#xff0c;看看它们如何以独特的魅力&#xf…

网站如何收费企业网站系统功能分析与设计

文章目录 Flutter应用让屏幕在 app 运行期间保持常亮的方法方法一&#xff1a;使用系统插件方法二&#xff1a;使用 Widgets注意事项 Flutter应用让屏幕在 app 运行期间保持常亮的方法 在 Flutter 开发中&#xff0c;可以使用以下两种方法让屏幕在 app 运行期间保持常亮&#…

网站备案 邮寄资料哪个小说网站版权做的好

问题分析子问题界定&#xff1a;由参数 k 和 y 界定k&#xff1a;考虑对物品1, 2, … , k 的选择 y&#xff1a;背包总重量不超过 y 原始输入&#xff1a;k n, y b 子问题计算顺序&#xff1a; k 1, 2, … , n 对于给定的 k&#xff0c;y 1, 2, … , b 定义问题 假设有 n 个…

怎样做淘宝商品链接导航网站古镇做灯饰网站的公司

推荐阅读&#xff1a;我的技术回顾那些与ABP框架有关的故事-2015年从ABP框架国内社区发展回顾.NET技术变迁-2016年从2022年来回顾ABP框架&#xff0c;我们会发现无论是商业模式还是架构设计思路&#xff0c;如果没有良好的商业模式的话&#xff0c;ABP框架很容易进入难产的状态…