版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.1系统技术栈介绍——.NetCore介绍.NetCore历程.NetCore简介.NetCore依赖注入.Net
Core中间件学习目标通过本节学习可以:重点学习.NetCore的依赖注入掌握.NetCore的中间件思想掌握.NetCore的基本概念了解.NetCore的历程01.NetCore历程.NetCore背景(1)2010之前的PC时代的时候,互联网规模还不是特别庞大,JAVA和.Net没什么太大区别,.net以windows自居。(2)2010年以JAVA为代表的Hadoop大数据兴起后,微软跟进失败,曾今也实现了一套api,但后来还是放弃维护了。(3)2012年移动互联网兴起,.net跟进失败。wp(windowsphone)市场占有率太低,微软就放弃了。(4)2014-2015微服务时代的来临,以go为代表的docker技术,python为代表的devops,java的springcloud技术兴起,微服务造就了多语言的盛行,微软还想维护的windows平台占有率,不想改变。(5)2014年云计算事业部副总裁萨提亚·纳德拉出任微软CEO,改变微软企业文化,开始开源、拥抱linux。(6)2015年微软对.net平台进行了重新架构。(7)2016.6.27netcore1.0项目发布,彻底的改变了windowsonly的场景,拥抱开源。这个版本不稳定。之后发展很快,有.NetCore1.1,.NetCore2.0,.NetCore2.1,.NetCore2.2,.NetCore3.1,NET5,。.NetCore历程2016-06-27.NetCore2016-11-162017-08-142018-05-302020-01-142019-12-032019-09-232018-12-042020-03-162020-03-242020-11-112021-11-092022-11-08预计2023-11.NetCore
1.0VS2015、C#6.0.NetCore
1.1VS2017、C#7.0.NetCore
2.0VS2017、C#7.1.NetCore
2.1VS2017、C#7.2/7.3.NetCore
3.1.2VS2019(V16.5)、C#8.0.NetCore
3.1.1VS2019(V16.4)、C#8.0.NetCore
3.1VS2019(V16.4)、C#8.0.NetCore
3.0VS2019、C#8.0.NetCore
2.2VS2017、C#7.3.NetCore
3.1.3VS2019(V16.5)、C#8.0.NET5VS2019(V16.8)、C#9.0.NET6VS2022、C#10.0.NET7VS2022、C#11.0.NET8VS2022、C#12.002.NetCore简介.NETcore简介运行时.NETCore中包含2种运行时:CoreCLR与NativeRunTime。CoreCLR是一个开源的JIT运行时,它将代码编译成中间语言(IL),在终端机器运行时再转换成机器码。NativeRuntime将C#、F#或VB代码直接转换为原生机器码直接运行。BCLBCL即BaseClasslibrary基础类,例如File、System、Console、XML、ADO.NET、日期时间等类库。AppModel提供上层应用产品开发,Web应用、游戏开发、桌面程序、物联网集成应用等。
.NETCore是基于.NETFramework为基础,借鉴了其优秀的思想与强大的功能,经过重新设计与构建,实现了.NETFramework中的部分功能(不包含WindowsUI部分),比如JIT、垃圾收集器(GC)、CLR、BCL等。.NetCore体系结构详解.NETcore简介.NETCore是由许多项目所组成,除了基本的类库(CoreFX)之外,也包含采用RyuJIT编译的运行平台CoreCLR、编译器平台.NETCompilerPlatform、采用AOT编译技术运行最优化的包CoreRT(.NETCoreRuntime),以及跨平台的MSIL编译器LLILC(LLVM-basedMSILCompiler)等项目。.NetCore核心组成NetCompilerPlatform:RoslynCoreFX.NET
Standard
LibrayCoreCLRCoreRTASP.NETCoreUWP应用层中间层底层.NETcore简介.NetCore核心组成【应用层】开发框架开发框架是开发基于UI应用的框架集,包括了ASP.NETCore(用于创建WebApp),和UWP(用于创建Windows10App)等。【中间层】核心类库CoreFX(.NETCoreLibraries):CoreFX主要包含数个公共库,例如System.Collections,System.IO,System.Xml等。CoreFX是.NETStandardLibrary的实现,同样的.NETFramework4.6.3也是基于.NETStandardLibrary的实现。.NETcore简介.NetCore核心组成【底层】编译器
CoreCLR:CoreCLR移植.NETFramework的CLR的功能,包含核心程序库mscorlib、JIT编译器、垃圾收集器(GC)以及其他运行MSIL所需要的运行期环境。核心功能包括:内存管理、程序集加载、安全性、异常、线程管理等。CoreRT:CoreRT是以AOT(Ahead-of-time)编译方式为主的核心功能,在.NETCore内称为CoreRT,在UWP则是称为.NETNative。CoreRT会在建造时期(非运行期)在编译时将MSIL转换成平台本地的机器码,以获取较短的引导时间(JIT采用的是运行时期编译,使得引导时间拉长),以及内存用量减少的优点。CoreRT会在不同的平台使用不同的AOT技术:
·Windows上使用的是.NETNative。
·macOS与Linux上使用的是LLILC(同时支持JIT和AOT)。Roslyn:.NETCompilerPlatform(项目代码为Roslyn)s是一个开源的跨平台源代码编译器。它是将.NET平台的编译架构标准化的平台,它可提供程序管理工具(如集成开发环境)相当多的情报,用以发展有助于编写程序与管理程序结构所需要的功能,例如类型信息、语法结构、参考链接、语义、编译器、自动化、错误回报等等功能,只要是遵循CLI标准的编程语言,都可以利用.NETCompilerPlatform实现出编译器,让程序管理工具能实现如语法提示、语法自动完成、关键字高亮等可视化能力。.Netcore简介跨平台.NETCore是一个跨平台的开源框架,它允许开发人员在不同的操作系统上构建和运行应用程序。以前的.NETFramework主要针对Windows平台,而.NETCore则支持Windows、macOS和Linux。通过使用.NETCore,开发人员可以编写一次代码,然后在不同的操作系统上运行它,而无需进行大量的修改。这为开发人员提供了更大的灵活性和可移植性,使他们能够更轻松地开发跨平台的应用程序。跨平台是.NETCore的一个重要特性,使开发人员能够在不同的操作系统上构建和部署应用程序,无论是在开发桌面应用程序、Web应用程序还是云服务,都能够获得更大的灵活性和可扩展性。.Netcore简介.NetCore优势(1)开源、跨平台:.NETCore是开放源代码通用开发平台,由Microsoft和.NET社区在GitHub上共同维护。它跨平台(支持Windows、macOS和Linux),用于构建web应用、IOT应用和移动后端应用。(2)性能优越。据.netcore团队给出来的性能测试数据来看,Acore(.netcore)相比与原来的Web(.netframework4.6)程序性能提升了2300%。跟python、java等相同环境比较,性能都要优越。(3)内置依赖注入(4)轻量级和模块化的HTTP请求管道(中间件)(5)能够在IIS上运行或在自宿主(self-host)的进程中运行03.NetCore依赖注入.NetCore依赖注入为什么要用依赖注入什么是依赖注入,为什么要使用呢?简单通俗说就是一个类需要另一个类来协助工作,就产生了依赖,所以需要的依赖项就要【注入】过来一起来协同完成工作。软件设计原则中有一个依赖倒置原则(DIP)讲的是要依赖于抽象,不要依赖于具体,高层模块不应该依赖于低层模块,二者应该依赖于抽象。简单的说就是为了更好的解耦。而控制反转(Ioc)就是这样的一个实现思路,这个思路的其中一种实现方式就是依赖注入(DI)。依赖注入的理解与应用.NetCore依赖注入为什么要用依赖注入依赖注入的理解与应用感觉有点绕,举个栗子:老李是一个维修工,现在要出任务去维修,得先去申领个扳手。老李:"请给我一把可以拧7mm大小的六角螺丝的扳手.",然后库管老张就从仓库里拿了一把这样的大力牌扳手给老李。.NetCore依赖注入为什么要用依赖注入在这个例子中,维修工老李只要告诉库管我要一个"可以拧7mm大小的六角螺丝"的扳手即可,他不用关心扳手的品牌和样式,也不用采购扳手,更不用关心这个扳手是怎么来的。而对于库管,他只需提供满足这样规则的一个扳手即可,不用去关心老李拿着这个扳手之后去干什么。所以老李和老张都只是关心"可以拧7mm大小的六角螺丝的"这个规则即可,也就是说,如果后期仓库里不再提供大力牌扳手,而是提供了这样的大牛牌扳手,无论换了什么牌子和样式,只要仍满足这个规则,老李仍然可以正常工作。它们定义了一个规则(比如接口IWrench7mm),二者都依赖于这个规则,然后仓库无论提供大力牌(WrenchDaLi:IWrench7mm)还是大牛牌(WrenchDaNiu:IWrench7mm),都不影响正常工作.依赖注入的理解与应用.NetCore依赖注入为什么要用依赖注入这就是依赖倒置原则(DIP),不依赖于具体(牌子),高层模块(老李)不应该依赖于低层模块(大力牌扳手),二者应该依赖于抽象(IWrench7mm:可以拧7mm大小的六角螺丝)。如果直接由老李去获取(new)大力牌扳手,那么当业务改变要求采用大牛牌的时候,我们就要去修改老李的代码。为了解耦,在本例中我们只要在配置中让仓库由原来的提供大力牌改为提供大牛牌即可。老李要使用的时候,可以通过注入(构造器、属性、方法)的方式,将仓库提供的扳手实例提供给老李使用。依赖注入的理解与应用.NetCore依赖注入依赖注入理解引入依赖注入的目的是为了解耦。说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用。这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将实现类替换。上面说的通过接口调用方法,实际上还是需要去实例化接口的实现类,只不过不需要我们手动new构造实现类,而是交给如微软的DI、Autofac这些工具去构建实现类。我们只需要告诉它们,某个类是某个接口的实现类,当用到的时候,工具(比如,微软的DI)会自动通过构造函数实例化类。依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入打开Startup这个文件,看一下里面的ConfigureServices方法。顾名思义,这个方法是用来配置服务,系统默认已经添加了一些服务,剩下的就是我们把自己需要的用的添加进去。参数为服务集合IServiceCollection对象,这种对象提供了AddSingleton、AddScoped和AddTransient三种方法来添加服务,三种方法添加的服务的生命周期不一样。依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入添加一个名为DIDemo的.NETCOREMVC项目,在该项目下创建一个服务文件夹(Servers)(1)定义接口Icount(2)实现接口类Count至此,服务(类)有了,那么如何能让这个服务为我们所用呢?或者说为我们服务呢?依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入(3)把类(服务)在Startup文件中通过ConfigureServices方法注入服务。使用容器的好处,由容器来统一管理实例的创建和销毁,你只需要关心怎么用就行了,不需要关系怎么创建跟销毁。当然容器创建的实例都是有生命周期的。三种创建方法创建的实例生命周期不一样。• Transient:瞬态模式,每一次访问都会创建一个新的实例• Scoped:域模式,在同一个Scope内只初始化一个实例,可以理解为(每一个request级别只创建一个实例,同一个httprequest会在一个scope内)。对象在一次请求中是相同的,但在不同请求中是不同的。• Singleton:单例模式,整个应用程序生命周期以内只创建一个实例依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入常用注入方式有三种如下:publicvoidConfigureServices(IServiceCollectionservices){ …… //下面先以AddScopend方法阐述下常用的三种注入方式
//1.最常用的注入方式,以接口形式暴露服务。下面2中方式意思一样
//1.1AddScopend后面是(),里面的接口和实现类必须套一层typeof services.AddScoped(typeof(ICount),typeof(Count)); //1.2AddScopend后面是<>,里面就直接写接口和实现类,当然最后有一个() services.AddScoped<ICount,Count>(); //2.自己注入自己,以实现形式暴露服务
services.AddScoped(typeof(Count)); services.AddScoped<Count>(); //3.需要传参的构造函数的类的注入(后面实例有应用讲解)
//services.AddScoped(typeof(ICount),sp=>{returnnewCount(参数);}); //services.AddScoped<ICount>(sp=>{returnnewCount(参数);}); ……}依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入(4)接下来分析演示三种注入方法的区别:上面ConfigureServices方法中保留下面的瞬态模式//第1种:瞬态模式,每一次访问都会创建一个新的实例services.AddTransient<ICount,Count>();服务注入之后,我们就要用它。切换到控制器。那么能把服务实例注入到控制器中来呢?有属性注入、构造方法注入、方法注入。这里一般会用构造方法注入。依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入publicclassHomeController:Controller{privateICount_count;//方便本类其他方法的调用,所以定义一个私有字段来接收
publicHomeController(ICountcount)//通过构造方法注入实例,ASP.NETCORE内置了依赖注入容器
{_count=count;}//说明:请求到home控制器,自然调用home控制器的构造方法,构造方法中需要一个ICount类型的对象,它怎么来的呢?这就是因为.NETCore内置了依赖注入容器,这个时候就会到StartUp.cs文件中的ConfigureServices方法中去找相应的依赖,而在那里告诉了ICount由Count来实现(services.AddTransient<ICount,Count>();),所以这时会去调用Count的构造方法实例化Count对象。
//接下来就可以在控制器中使用_countpublicIActionResultIndex(){intc=_count.MyCount();ViewBag.count=c;returnView();} ……}依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入前端展示:运行效果,不断刷新页面也总是0,因为瞬态模式注入的服务,每一次访问都会创建一个新的实例。依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入上面ConfigureServices方法中改为下面的单例模式//第2种:单例模式,整个应用程序生命周期以内只创建一个实例services.AddSingleton<ICount,Count>();运行效果,不断刷新页面不断增加1.依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入继续把上面ConfigureServices方法中改为下面的域模式//第3种:域模式,在同一个Scope内只初始化一个实例,可以理解为(每一个request级别只创建一个实例,同一个httprequest会在一个scope内)services.AddScoped<ICount,Count>();运行效果,不断刷新页面一直保持为0,因为每次刷新页面都是一个新的请求,所以总是0,在一个请求内产生的实例对象才是唯一。依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入改进下测试代码publicclassHomeController:Controller{privateIServiceProvider_provider;privateICount_count;//方便本类其他方法的调用,所以定义一个私有字段来接收
publicHomeController(ICountcount,IServiceProviderprovider)//通过构造方法注入实例,ASP.NETCORE内置了依赖注入容器
{_count=count;_provider=provider;}publicIActionResultIndex()//接下来就可以在控制器中使用_count{//intc=_count.MyCount();//ViewBag.count=c; //注意导入usingMicrosoft.Extensions.DependencyInjection;ICountcount1=_provider.GetService<ICount>();ICountcount2=_provider.GetService<ICount>();intc1=count1.MyCount();intc2=count2.MyCount();ViewBag.count1=c1;ViewBag.count2=c2; returnView();}}依赖注入的理解与应用.NetCore依赖注入依赖的服务如何注入前端调整,如右图:测试发现c1、c2分别为0,1但是每次刷新又重新为0,1因为每次刷新页面都是一个新的请求,所以总是0,在一个请求内产生的实例对象才是唯一依赖注入的理解与应用.NetCore依赖注入如何在视图中直接使用依赖注入如下图修改视图,主要是通过@inject去注入实例对象:@{ViewData["Title"]="HomePage";}@ViewBag.count1@ViewBag.count2@injectDIDemo.Servies.ICountcount@{intc=count.MyCount();}@c<divclass="text-center"><h1class="display-4">Welcome</h1><p>Learnabout<ahref="/aspnet/core">buildingWebappswithASP.NETCore</a>.</p></div>依赖注入的理解与应用新增@inject注入的写法验证.NetCore依赖注入如何在视图中直接使用依赖注入运行结果为2,原因是因为在控制器中生成的实例中已经得到0、1,而视图中的实例还是通过控制器注入时生成的那个实例,所以这个时候为2如果在st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度山林承包权联合经营合同4篇
- 2025年度智慧社区建设项目承包合同补充协议4篇
- 2025年度大型水电站PC构件吊装施工合同3篇
- 2025年度事业单位离职创业人员创业项目风险补偿基金合作协议4篇
- 2024版轮流抚养的离婚协议范本
- 2025年度生态园区车位租赁电子合同(含绿色出行)4篇
- 2025年度智能充电桩一体化解决方案购销合同范本4篇
- 2024绿化施工劳务分包合同范本
- 2025年度智能家居窗帘系统定制安装合同范本4篇
- 2024面粉公司社区团购代理销售合同范本3篇
- 谅解书(标准样本)
- 2022年浙江省事业编制招聘考试《计算机专业基础知识》真题试卷【1000题】
- 认养一头牛IPO上市招股书
- GB/T 3767-2016声学声压法测定噪声源声功率级和声能量级反射面上方近似自由场的工程法
- GB/T 23574-2009金属切削机床油雾浓度的测量方法
- 西班牙语构词.前后缀
- 动物生理学-全套课件(上)
- 河北省衡水市各县区乡镇行政村村庄村名居民村民委员会明细
- DB32-T 2665-2014机动车维修费用结算规范-(高清现行)
- 智能消防设备公司市场营销方案
- 最新6000亩海带筏式养殖投资建设项目可行性研究报告
评论
0/150
提交评论