




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
——Linq常用语法1.1系统技术栈介绍Linq分类Linq查询方法语句和查询语句什么是Linq知识回顾认识数据库ADO.NET常用类下载并安装SQLServer数据库创建SQLServer数据库创建SQLServer数据表使用ADO.NET访问数据库学习目标通过本节学习可以:重点学习Linq查询掌握Linq分类掌握方法语句和查询语句了解什么是Linq01什么是Linq什么是LinqLINQ(LanguageIntegratedQuery)是一种在.NET平台上进行数据查询和操作的技术。它是一种将查询语句集成到编程语言中的方法,使得开发人员可以使用统一的语法来查询和操作各种数据源,如集合、数据库、XML等。LINQ提供了一种统一的查询语法,类似于SQL语句,使得查询代码更加直观易懂。通过LINQ,开发人员可以使用类似于SQL的查询语句来对数据进行筛选、排序、分组、连接等操作,而无需手动编写循环和条件判断的代码。什么是LinqLinq的优势统一的查询语法:Linq提供了统一的查询语法,使得查询操作变得更加简洁和易于理解;强类型检查:LINQ是基于.NET编程语言的,利用编译时的强类型检查机制,可以在编译时发现类型错误和语法错误,从而提供更好的代码可靠性和调试体验。强大的查询能力:LINQ提供了丰富的查询操作,可以对数据进行多种方式的筛选、排序、分组、连接等操作,满足不同的查询需求。惰性查询执行:LINQ使用延迟加载的方式执行查询操作,即只有在真正需要结果时才执行查询。Lambda表达式:LINQ使用Lambda表达式来定义查询条件和操作,Lambda表达式提供了一种更简洁和灵活的方式来编写查询代码。Linq的优势02Linq分类思考题 Linq包括哪些分类?Linq的分类LINQ包括五个部分:LINQtoObjects、LINQtoSQL、LINQtoDataSets、LINQtoEntities、LINQtoXML。LINQtoObject用于对内存中的对象集合进行查询和操作。它是LINQ的基础部分,支持对各种.NET集合(如List、Array、Dictionary等)进行查询,包括筛选、排序、投影、分组等操作。LINQtoSQL用于与关系型数据库进行交互。它提供了一种将数据库表映射为.NET对象的方式,使得开发人员可以使用LINQ查询语法对数据库进行查询和操作。LINQtoSQL使用了ORM(对象关系映射)的思想,将数据库中的表和行转化为.NET中的类和对象。Linq的分类Linq的分类LINQtoDataSet用于对.NET中的DataSet和DataTable进行查询和操作。DataSet是.NET中的一种内存中的数据容器,用于存储和操作数据。LINQtoDataSet提供了一种使用LINQ查询语法对DataSet和DataTable进行查询、排序、筛选等操作的方式。LINQtoEntities是EntityFramework提供的一种LINQ提供者,用于与数据库进行交互。它支持对关系型数据库进行查询和操作,类似于LINQtoSQL,但更加灵活和强大。LINQtoEntities可以处理复杂的查询需求,支持更多的数据库提供者和功能。LINQtoXML用于对XML文档进行查询和操作。它提供了一种方便的方式来处理XML数据,包括创建、修改、查询和转换XML文档。LINQtoXML使用LINQ查询语法来操作XML数据,使得XML处理变得简单而直观。Linq的分类03Linq查询思考题 Linq查询的子句包括哪些?Linq查询LINQ查询的根本目的是从指定的数据源中查询满足符合特定条件的元素,并且根据需要对这些查询到的元素进行排序、连接等操作。LINQ查询包括四个主要元素:1、数据源:表示LINQ查询将从哪里查找数据,它通常是一个或多个数据集,每个数据集包含一系列的元素。2、目标数据:用来指定查询具体想要的是什么数据,在LNQ中,它定义了查询结果数据集中元素的具体类型。3、筛选条件:定义了对数据源中元素的过滤条件,只有满足条件的元素才作为查询结果返回。筛选条件可以是简单的逻辑表达式,也可以是复杂的逻辑函数。4、附加操作:表示一些其他的对查询结果的辅助操作,比如,对查询结果进行排序,分组等。
数据源和目标数据是LINQ查询的必备元素,筛选条件和附加操作是可选元素。注意:LINQ查询代码中关键字必须小写。Linq查询Linq查询from:用from子句指定数据源
LINQ查询中,通常以from子句开始,from子句指定查询将采用的数据源,同时定义一个本地变量,表示数据源中单个元素,整个LINQ查询都是对该元素进行查询,单个from子句的编写格式如下:
select:用select子句指定目标数据LINQ查询中,查询结果本身则通过select或group子句来定义,其中select子句最常用,它指定的查询结果为一维的查询结果。select子句的定义如下:from、selectfromlocalVarindataSource
fromlocalVarindataSourceselectexpressionLinq查询selectstaticvoidMain(string[]args){
int[]intAry={78,19,100,12,23,60};varresultList=fromintvalinintAry
selectintval;foreach(variteminresultList)
{System.Console.WriteLine(item);
}Console.ReadKey(); }Linq查询select创建匿名类型selectstaticvoidMain(string[]args){int[]intAry={78,19,100,12,23,60};varresultList=fromintvalinintAryselectnew{intValue=intval, doubleValue=intval*2};foreach(variteminresultList)System.Console.WriteLine(item);
Console.ReadKey();}通过new创建了一个匿名类Linq查询用where子句指定筛选条件LINQ中,通过where子句指定对元素进行过滤的条件,where子句的位置在from之后select之前,定义如下:condition表示过滤条件,是任何类型为bool的表达式。where
fromlocalVarindataSourcewhereconditionselectexpressionLinq查询where staticvoidMain(string[]args){int[]intAry={78,19,100,12,23,60};varresultList=fromintvalinintAry
whereintval>50&&intval<90selectintval;
foreach(variteminresultList)System.Console.WriteLine(item);
Console.ReadKey();}Where通过表达式过滤条件Linq查询wherestaticvoidMain(string[]args){int[]intAry={78,19,100,12,23,60};varresultList=fromintvalinintAry
whereIsScope(intval)selectintval;foreach(variteminresultList)System.Console.WriteLine(item);}privatestaticboolIsScope(inttemp){if(temp>50&&temp<90){returntrue;}returnfalse;}Where后面跟方法过滤表达式Linq查询用orderby子句实现排序LINQ中,通过orderby子句对查询结果进行排序。定义如下:expression是要进行排序的表达式,sortType是可选参数,表示排序类型,包括升序(ascending)和降序(desending)两个可选值,默认升序。orderbyorderbyexpression[sortType]Linq查询orderbystaticvoidMain(string[]args){int[]intAry={78,19,100,12,23,60};varresultList=fromintvalinintAry
orderbyintvaldescendingselectintval; foreach(variteminresultList) System.Console.WriteLine(item); Console.ReadKey();}通过orderby进行降序排序Linq查询用group子句实现分组LINQ中,通过group子句对查询结果进行分组,定义如下:expression是一个表达式,用于计算产生查询结果中是一个表达式,by用于计算产生查询结果中的元素,而key同样是一个表达式,用于计算进行分组的条件。groupgroupexpressionbykeyLinq查询groupstaticvoidMain(string[]args){int[]intAry={100,19,78,12,23,60};varresultList=fromintvalinintAry
groupintvalbyintval%3;
foreach(vargrpinresultList) {System.Console.Write("key={0}:",grp.Key);foreach(varitemingrp)System.Console.Write("{0},",item);System.Console.WriteLine(); }}根据3的余数进行分组Linq查询用并列from子句实现连接LINQ中,通过并列from子句可以从多个数据源中获取数据并进行查询,它的语法和单个from子句一样,只是每个from子句的临时变量名称不能相同,每个临时变量表示来自对应数据源的元素。多个from子句实际上可以看成是多次循环。fromLinq查询fromstaticvoidMain(string[]args){int[]intAry1={100,19,78,12,23,60};int[]intAry2={2,1,3};varresultList=
fromintval1inintAry1fromintval2inintAry2selectnew{tmp1=intval1,tem2=intval2,sum=intval1+intval2};
foreach(variteminresultList) System.Console.WriteLine(item);}两个from子句进行查询,且from子句中的临时变量intval1和intval2不能相同Linq查询First()返回集合中的一个元素,其实质就是在SQL语句中加TOP(1)。First()staticvoidMain(string[]args)
{int[]intAry={78,19,100,12,23,60};varresultList=(fromintvalinintAryselectintval).First();System.Console.WriteLine(resultList);Console.ReadKey(); }返回查询结果的第一笔数据Linq查询FirstOrDefault()返回集合中的一个元素,其实质就是在SQL语句中加TOP(1)。FirstOrDefault()staticvoidMain(string[]args)
{int[]intAry={78,19,100,12,23,60};varresultList=(fromintvalinintAryselectintval).FirstOrDefault();System.Console.WriteLine(resultList);Console.ReadKey(); }返回查询结果的第一笔数据Linq查询First()与FirstOrDefault()的区别:First():
First()方法返回序列中的第一个元素,如果序列为空,则抛出InvalidOperationException异常。这意味着如果调用First()方法时序列为空,将会导致运行时异常。FirstOrDefault():
FirstOrDefault()方法返回序列中的第一个元素,如果序列为空,则返回默认值。默认值的类型取决于序列元素的类型,例如,如果元素是引用类型,则返回null,如果元素是值类型,则返回对应类型的默认值(如0、false等)
。First()与FirstOrDefault()的区别Linq查询Distinct()筛选字段中不相同的值。用于查询不重复的结果集。Distinct()
staticvoidMain(string[]args)
{int[]intAry1={100,12,78,12,78,60};varresultList=(fromintval1inintAry1selectintval1).Distinct();foreach(variteminresultList)System.Console.WriteLine(item);Console.ReadKey(); }去除重复数据Linq查询Count()返回集合中的元素个数,返回INT类型1.简单形式:2.带条件形式:Countvarcount=(fromintvalinuserListselectintval).Count();varcount=(fromintvalinuserListselectintval).Count(p=>p.Age>22);Linq查询Count()
staticvoidMain(string[]args)
{int[]intAry1={100,12,78,12,78,60};varcount=(fromintval1inintAry1selectintval1).Count(p=>p>12); System.Console.WriteLine(count);Console.ReadKey(); }求集合中元素大于12的个数Linq查询Any()
用于检查序列中是否存在满足指定条件的元素。anyList<int>numbers=newList<int>{1,2,3,4,5};boolhasElements=numbers.Any();boolhasEvenNumbers=numbers.Any(num=>num%2==0);
List<int>emptyList=newList<int>();boolhasElements2=emptyList.Any();返回true,因为numbers序列中存在元素返回true,因为numbers序列中存在偶数元素2和4返回false,因为emptyList序列为空Linq查询All()
用于检查序列中的所有元素是否都满足指定条件。allList<int>numbers=newList<int>{1,2,3,4,5};boolallPositive=numbers.All(num=>num>0);boolallEven=numbers.All(num=>num%2==0);List<int>emptyList=newList<int>();boolallPositive2=emptyList.All(num=>num>0);返回true,因为numbers序列中的所有元素都大于0返回false,因为numbers序列中存在奇数元素返回true,因为emptyList序列中没有元素,相当于所有元素都满足条件Linq查询Sum()返回集合中数值类型元素之和,集合应为INT类型集合。1.简单形式:2.带条件形式:其他操作符如Max、Min、Average、Last、Skip等不再一一说明,使用形式类似Sum()。Sumvarsum=(fromintvalinuserListselectintval.Age).Sum();varsum=(fromintvalinuserListselectintval).Sum(p=>p.Age);Linq查询Sum
staticvoidMain(string[]args)
{ int[]intAry1={100,12,78,12,78,60};varresultCount=(fromintval1inintAry1selectintval1).Sum();System.Console.WriteLine(resultCount); Console.ReadKey(); }对集合的元素进行求和Linq查询Sum
staticvoidMain(string[]args)
{ int[]intAry1={100,12,78,12,78,60};intresultCount1=(fromintval1inintAry1selectnew
{Age=intval1,Age1=intval1*2}).Sum(p=>p.Age1);Console.WriteLine(resultCount1);Console.ReadKey(); }求集合中Age1元素的和04方法语句和查询语句思考题 Linq提供了哪两种主要的语法风格?分别是如何使用的?方法语句和查询语句LINQ提供了两种主要的语法风格:方法语句和查询语句。这两种语法风格都可以用于编写LINQ查询,只是表达方式不同,但它们可以互相转换。方法语句方法语句使用点号(.)来链接方法调用,每个方法调用都对应于一个LINQ操作
。使用示例如下:其中,Where()用于筛选满足条件的元素,OrderBy()用于按照指定的属性进行排序,Select()用于选择指定的属性。这些方法调用按照顺序链接在一起,构成了一个完整的LINQ查询
。方法语句和查询语句varquery=collection.Where(x=>x.Age>18).OrderBy(x=>x.LastName).Select(x=>x.FirstName);方法语句和查询语句查询语句查询语句使用类似于SQL的语法来编写LINQ查询,它使用关键字(如from、where、orderby、select等)来描述查询的各个部分,以及使用查询变量来表示查询的结果
;其中,from关键字用于指定要查询的集合,where关键字用于筛选满足条件的元素,orderby关键字用于按照指定的属性进行排序,select关键字用于选择指定的属性。查询语句通过关键字和查询变量的组合来描述整个LINQ查询
。方法语句和查询语句varquery=frompersonincollectionwhereperson.Age>18orderbyperson.LastNameselectperson.FirstName;练习✎本章练习Linq查询中Any与All的区别?Linq查询中First()与FirstOrDefault()的区别?✎预习练习在.NETCore中,什么是依赖注入(DependencyInjection)?本章小节本章主要讲解了Linq的常用语法,包括:首先介绍了什么是Linq;其次介绍了Linq的分类;再次详细讲解了Linq的查询;最后讲解了Linq的方法语句和查询语句。Linq查询在C#程序开发中比较重要,学员必须掌握。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()//接下来就可以在控制器中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论