MES開(kāi)發(fā)與應(yīng)用 課件 1.1.12 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-Linq常用語(yǔ)法;1.1.13 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-DotNetCore介紹_第1頁(yè)
MES開(kāi)發(fā)與應(yīng)用 課件 1.1.12 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-Linq常用語(yǔ)法;1.1.13 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-DotNetCore介紹_第2頁(yè)
MES開(kāi)發(fā)與應(yīng)用 課件 1.1.12 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-Linq常用語(yǔ)法;1.1.13 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-DotNetCore介紹_第3頁(yè)
MES開(kāi)發(fā)與應(yīng)用 課件 1.1.12 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-Linq常用語(yǔ)法;1.1.13 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-DotNetCore介紹_第4頁(yè)
MES開(kāi)發(fā)與應(yīng)用 課件 1.1.12 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-Linq常用語(yǔ)法;1.1.13 工業(yè)管理軟件系統(tǒng)技術(shù)棧介紹-DotNetCore介紹_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

——Linq常用語(yǔ)法1.1系統(tǒng)技術(shù)棧介紹Linq分類Linq查詢方法語(yǔ)句和查詢語(yǔ)句什么是Linq知識(shí)回顧認(rèn)識(shí)數(shù)據(jù)庫(kù)ADO.NET常用類下載并安裝SQLServer數(shù)據(jù)庫(kù)創(chuàng)建SQLServer數(shù)據(jù)庫(kù)創(chuàng)建SQLServer數(shù)據(jù)表使用ADO.NET訪問(wèn)數(shù)據(jù)庫(kù)學(xué)習(xí)目標(biāo)通過(guò)本節(jié)學(xué)習(xí)可以:重點(diǎn)學(xué)習(xí)Linq查詢掌握Linq分類掌握方法語(yǔ)句和查詢語(yǔ)句了解什么是Linq01什么是Linq什么是LinqLINQ(LanguageIntegratedQuery)是一種在.NET平臺(tái)上進(jìn)行數(shù)據(jù)查詢和操作的技術(shù)。它是一種將查詢語(yǔ)句集成到編程語(yǔ)言中的方法,使得開(kāi)發(fā)人員可以使用統(tǒng)一的語(yǔ)法來(lái)查詢和操作各種數(shù)據(jù)源,如集合、數(shù)據(jù)庫(kù)、XML等。LINQ提供了一種統(tǒng)一的查詢語(yǔ)法,類似于SQL語(yǔ)句,使得查詢代碼更加直觀易懂。通過(guò)LINQ,開(kāi)發(fā)人員可以使用類似于SQL的查詢語(yǔ)句來(lái)對(duì)數(shù)據(jù)進(jìn)行篩選、排序、分組、連接等操作,而無(wú)需手動(dòng)編寫(xiě)循環(huán)和條件判斷的代碼。什么是LinqLinq的優(yōu)勢(shì)統(tǒng)一的查詢語(yǔ)法:Linq提供了統(tǒng)一的查詢語(yǔ)法,使得查詢操作變得更加簡(jiǎn)潔和易于理解;強(qiáng)類型檢查:LINQ是基于.NET編程語(yǔ)言的,利用編譯時(shí)的強(qiáng)類型檢查機(jī)制,可以在編譯時(shí)發(fā)現(xiàn)類型錯(cuò)誤和語(yǔ)法錯(cuò)誤,從而提供更好的代碼可靠性和調(diào)試體驗(yàn)。強(qiáng)大的查詢能力:LINQ提供了豐富的查詢操作,可以對(duì)數(shù)據(jù)進(jìn)行多種方式的篩選、排序、分組、連接等操作,滿足不同的查詢需求。惰性查詢執(zhí)行:LINQ使用延遲加載的方式執(zhí)行查詢操作,即只有在真正需要結(jié)果時(shí)才執(zhí)行查詢。Lambda表達(dá)式:LINQ使用Lambda表達(dá)式來(lái)定義查詢條件和操作,Lambda表達(dá)式提供了一種更簡(jiǎn)潔和靈活的方式來(lái)編寫(xiě)查詢代碼。Linq的優(yōu)勢(shì)02Linq分類思考題 Linq包括哪些分類?Linq的分類LINQ包括五個(gè)部分:LINQtoObjects、LINQtoSQL、LINQtoDataSets、LINQtoEntities、LINQtoXML。LINQtoObject用于對(duì)內(nèi)存中的對(duì)象集合進(jìn)行查詢和操作。它是LINQ的基礎(chǔ)部分,支持對(duì)各種.NET集合(如List、Array、Dictionary等)進(jìn)行查詢,包括篩選、排序、投影、分組等操作。LINQtoSQL用于與關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互。它提供了一種將數(shù)據(jù)庫(kù)表映射為.NET對(duì)象的方式,使得開(kāi)發(fā)人員可以使用LINQ查詢語(yǔ)法對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢和操作。LINQtoSQL使用了ORM(對(duì)象關(guān)系映射)的思想,將數(shù)據(jù)庫(kù)中的表和行轉(zhuǎn)化為.NET中的類和對(duì)象。Linq的分類Linq的分類LINQtoDataSet用于對(duì).NET中的DataSet和DataTable進(jìn)行查詢和操作。DataSet是.NET中的一種內(nèi)存中的數(shù)據(jù)容器,用于存儲(chǔ)和操作數(shù)據(jù)。LINQtoDataSet提供了一種使用LINQ查詢語(yǔ)法對(duì)DataSet和DataTable進(jìn)行查詢、排序、篩選等操作的方式。LINQtoEntities是EntityFramework提供的一種LINQ提供者,用于與數(shù)據(jù)庫(kù)進(jìn)行交互。它支持對(duì)關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行查詢和操作,類似于LINQtoSQL,但更加靈活和強(qiáng)大。LINQtoEntities可以處理復(fù)雜的查詢需求,支持更多的數(shù)據(jù)庫(kù)提供者和功能。LINQtoXML用于對(duì)XML文檔進(jìn)行查詢和操作。它提供了一種方便的方式來(lái)處理XML數(shù)據(jù),包括創(chuàng)建、修改、查詢和轉(zhuǎn)換XML文檔。LINQtoXML使用LINQ查詢語(yǔ)法來(lái)操作XML數(shù)據(jù),使得XML處理變得簡(jiǎn)單而直觀。Linq的分類03Linq查詢思考題 Linq查詢的子句包括哪些?Linq查詢LINQ查詢的根本目的是從指定的數(shù)據(jù)源中查詢滿足符合特定條件的元素,并且根據(jù)需要對(duì)這些查詢到的元素進(jìn)行排序、連接等操作。LINQ查詢包括四個(gè)主要元素:1、數(shù)據(jù)源:表示LINQ查詢將從哪里查找數(shù)據(jù),它通常是一個(gè)或多個(gè)數(shù)據(jù)集,每個(gè)數(shù)據(jù)集包含一系列的元素。2、目標(biāo)數(shù)據(jù):用來(lái)指定查詢具體想要的是什么數(shù)據(jù),在LNQ中,它定義了查詢結(jié)果數(shù)據(jù)集中元素的具體類型。3、篩選條件:定義了對(duì)數(shù)據(jù)源中元素的過(guò)濾條件,只有滿足條件的元素才作為查詢結(jié)果返回。篩選條件可以是簡(jiǎn)單的邏輯表達(dá)式,也可以是復(fù)雜的邏輯函數(shù)。4、附加操作:表示一些其他的對(duì)查詢結(jié)果的輔助操作,比如,對(duì)查詢結(jié)果進(jìn)行排序,分組等。

數(shù)據(jù)源和目標(biāo)數(shù)據(jù)是LINQ查詢的必備元素,篩選條件和附加操作是可選元素。注意:LINQ查詢代碼中關(guān)鍵字必須小寫(xiě)。Linq查詢Linq查詢from:用from子句指定數(shù)據(jù)源

LINQ查詢中,通常以from子句開(kāi)始,from子句指定查詢將采用的數(shù)據(jù)源,同時(shí)定義一個(gè)本地變量,表示數(shù)據(jù)源中單個(gè)元素,整個(gè)LINQ查詢都是對(duì)該元素進(jìn)行查詢,單個(gè)from子句的編寫(xiě)格式如下:

select:用select子句指定目標(biāo)數(shù)據(jù)LINQ查詢中,查詢結(jié)果本身則通過(guò)select或group子句來(lái)定義,其中select子句最常用,它指定的查詢結(jié)果為一維的查詢結(jié)果。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創(chuàng)建匿名類型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();}通過(guò)new創(chuàng)建了一個(gè)匿名類Linq查詢用where子句指定篩選條件LINQ中,通過(guò)where子句指定對(duì)元素進(jìn)行過(guò)濾的條件,where子句的位置在from之后select之前,定義如下:condition表示過(guò)濾條件,是任何類型為bool的表達(dá)式。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通過(guò)表達(dá)式過(guò)濾條件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后面跟方法過(guò)濾表達(dá)式Linq查詢用orderby子句實(shí)現(xiàn)排序LINQ中,通過(guò)orderby子句對(duì)查詢結(jié)果進(jìn)行排序。定義如下:expression是要進(jìn)行排序的表達(dá)式,sortType是可選參數(shù),表示排序類型,包括升序(ascending)和降序(desending)兩個(gè)可選值,默認(rèn)升序。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();}通過(guò)orderby進(jìn)行降序排序Linq查詢用group子句實(shí)現(xiàn)分組LINQ中,通過(guò)group子句對(duì)查詢結(jié)果進(jìn)行分組,定義如下:expression是一個(gè)表達(dá)式,用于計(jì)算產(chǎn)生查詢結(jié)果中是一個(gè)表達(dá)式,by用于計(jì)算產(chǎn)生查詢結(jié)果中的元素,而key同樣是一個(gè)表達(dá)式,用于計(jì)算進(jìn)行分組的條件。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(); }}根據(jù)3的余數(shù)進(jìn)行分組Linq查詢用并列from子句實(shí)現(xiàn)連接LINQ中,通過(guò)并列from子句可以從多個(gè)數(shù)據(jù)源中獲取數(shù)據(jù)并進(jìn)行查詢,它的語(yǔ)法和單個(gè)from子句一樣,只是每個(gè)from子句的臨時(shí)變量名稱不能相同,每個(gè)臨時(shí)變量表示來(lái)自對(duì)應(yīng)數(shù)據(jù)源的元素。多個(gè)from子句實(shí)際上可以看成是多次循環(huán)。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);}兩個(gè)from子句進(jìn)行查詢,且from子句中的臨時(shí)變量intval1和intval2不能相同Linq查詢First()返回集合中的一個(gè)元素,其實(shí)質(zhì)就是在SQL語(yǔ)句中加TOP(1)。First()staticvoidMain(string[]args)

{int[]intAry={78,19,100,12,23,60};varresultList=(fromintvalinintAryselectintval).First();System.Console.WriteLine(resultList);Console.ReadKey(); }返回查詢結(jié)果的第一筆數(shù)據(jù)Linq查詢FirstOrDefault()返回集合中的一個(gè)元素,其實(shí)質(zhì)就是在SQL語(yǔ)句中加TOP(1)。FirstOrDefault()staticvoidMain(string[]args)

{int[]intAry={78,19,100,12,23,60};varresultList=(fromintvalinintAryselectintval).FirstOrDefault();System.Console.WriteLine(resultList);Console.ReadKey(); }返回查詢結(jié)果的第一筆數(shù)據(jù)Linq查詢First()與FirstOrDefault()的區(qū)別:First():

First()方法返回序列中的第一個(gè)元素,如果序列為空,則拋出InvalidOperationException異常。這意味著如果調(diào)用First()方法時(shí)序列為空,將會(huì)導(dǎo)致運(yùn)行時(shí)異常。FirstOrDefault():

FirstOrDefault()方法返回序列中的第一個(gè)元素,如果序列為空,則返回默認(rèn)值。默認(rèn)值的類型取決于序列元素的類型,例如,如果元素是引用類型,則返回null,如果元素是值類型,則返回對(duì)應(yīng)類型的默認(rèn)值(如0、false等)

。First()與FirstOrDefault()的區(qū)別Linq查詢Distinct()篩選字段中不相同的值。用于查詢不重復(fù)的結(jié)果集。Distinct()

staticvoidMain(string[]args)

{int[]intAry1={100,12,78,12,78,60};varresultList=(fromintval1inintAry1selectintval1).Distinct();foreach(variteminresultList)System.Console.WriteLine(item);Console.ReadKey(); }去除重復(fù)數(shù)據(jù)Linq查詢Count()返回集合中的元素個(gè)數(shù),返回INT類型1.簡(jiǎn)單形式: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的個(gè)數(shù)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,因?yàn)閚umbers序列中存在元素返回true,因?yàn)閚umbers序列中存在偶數(shù)元素2和4返回false,因?yàn)閑mptyList序列為空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,因?yàn)閚umbers序列中的所有元素都大于0返回false,因?yàn)閚umbers序列中存在奇數(shù)元素返回true,因?yàn)閑mptyList序列中沒(méi)有元素,相當(dāng)于所有元素都滿足條件Linq查詢Sum()返回集合中數(shù)值類型元素之和,集合應(yīng)為INT類型集合。1.簡(jiǎn)單形式:2.帶條件形式:其他操作符如Max、Min、Average、Last、Skip等不再一一說(shuō)明,使用形式類似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(); }對(duì)集合的元素進(jìn)行求和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方法語(yǔ)句和查詢語(yǔ)句思考題 Linq提供了哪兩種主要的語(yǔ)法風(fēng)格?分別是如何使用的?方法語(yǔ)句和查詢語(yǔ)句LINQ提供了兩種主要的語(yǔ)法風(fēng)格:方法語(yǔ)句和查詢語(yǔ)句。這兩種語(yǔ)法風(fēng)格都可以用于編寫(xiě)LINQ查詢,只是表達(dá)方式不同,但它們可以互相轉(zhuǎn)換。方法語(yǔ)句方法語(yǔ)句使用點(diǎn)號(hào)(.)來(lái)鏈接方法調(diào)用,每個(gè)方法調(diào)用都對(duì)應(yīng)于一個(gè)LINQ操作

。使用示例如下:其中,Where()用于篩選滿足條件的元素,OrderBy()用于按照指定的屬性進(jìn)行排序,Select()用于選擇指定的屬性。這些方法調(diào)用按照順序鏈接在一起,構(gòu)成了一個(gè)完整的LINQ查詢

。方法語(yǔ)句和查詢語(yǔ)句varquery=collection.Where(x=>x.Age>18).OrderBy(x=>x.LastName).Select(x=>x.FirstName);方法語(yǔ)句和查詢語(yǔ)句查詢語(yǔ)句查詢語(yǔ)句使用類似于SQL的語(yǔ)法來(lái)編寫(xiě)LINQ查詢,它使用關(guān)鍵字(如from、where、orderby、select等)來(lái)描述查詢的各個(gè)部分,以及使用查詢變量來(lái)表示查詢的結(jié)果

;其中,from關(guān)鍵字用于指定要查詢的集合,where關(guān)鍵字用于篩選滿足條件的元素,orderby關(guān)鍵字用于按照指定的屬性進(jìn)行排序,select關(guān)鍵字用于選擇指定的屬性。查詢語(yǔ)句通過(guò)關(guān)鍵字和查詢變量的組合來(lái)描述整個(gè)LINQ查詢

。方法語(yǔ)句和查詢語(yǔ)句varquery=frompersonincollectionwhereperson.Age>18orderbyperson.LastNameselectperson.FirstName;練習(xí)?本章練習(xí)Linq查詢中Any與All的區(qū)別?Linq查詢中First()與FirstOrDefault()的區(qū)別??預(yù)習(xí)練習(xí)在.NETCore中,什么是依賴注入(DependencyInjection)?本章小節(jié)本章主要講解了Linq的常用語(yǔ)法,包括:首先介紹了什么是Linq;其次介紹了Linq的分類;再次詳細(xì)講解了Linq的查詢;最后講解了Linq的方法語(yǔ)句和查詢語(yǔ)句。Linq查詢?cè)贑#程序開(kāi)發(fā)中比較重要,學(xué)員必須掌握。1.1系統(tǒng)技術(shù)棧介紹——.NetCore介紹.NetCore歷程.NetCore簡(jiǎn)介.NetCore依賴注入.Net

Core中間件學(xué)習(xí)目標(biāo)通過(guò)本節(jié)學(xué)習(xí)可以:重點(diǎn)學(xué)習(xí).NetCore的依賴注入掌握.NetCore的中間件思想掌握.NetCore的基本概念了解.NetCore的歷程01.NetCore歷程.NetCore背景(1)2010之前的PC時(shí)代的時(shí)候,互聯(lián)網(wǎng)規(guī)模還不是特別龐大,JAVA和.Net沒(méi)什么太大區(qū)別,.net以windows自居。(2)2010年以JAVA為代表的Hadoop大數(shù)據(jù)興起后,微軟跟進(jìn)失敗,曾今也實(shí)現(xiàn)了一套api,但后來(lái)還是放棄維護(hù)了。(3)2012年移動(dòng)互聯(lián)網(wǎng)興起,.net跟進(jìn)失敗。wp(windowsphone)市場(chǎng)占有率太低,微軟就放棄了。(4)2014-2015微服務(wù)時(shí)代的來(lái)臨,以go為代表的docker技術(shù),python為代表的devops,java的springcloud技術(shù)興起,微服務(wù)造就了多語(yǔ)言的盛行,微軟還想維護(hù)的windows平臺(tái)占有率,不想改變。(5)2014年云計(jì)算事業(yè)部副總裁薩提亞·納德拉出任微軟CEO,改變微軟企業(yè)文化,開(kāi)始開(kāi)源、擁抱linux。(6)2015年微軟對(duì).net平臺(tái)進(jìn)行了重新架構(gòu)。(7)2016.6.27netcore1.0項(xiàng)目發(fā)布,徹底的改變了windowsonly的場(chǎng)景,擁抱開(kāi)源。這個(gè)版本不穩(wěn)定。之后發(fā)展很快,有.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預(yù)計(jì)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簡(jiǎn)介.NETcore簡(jiǎn)介運(yùn)行時(shí).NETCore中包含2種運(yùn)行時(shí):CoreCLR與NativeRunTime。CoreCLR是一個(gè)開(kāi)源的JIT運(yùn)行時(shí),它將代碼編譯成中間語(yǔ)言(IL),在終端機(jī)器運(yùn)行時(shí)再轉(zhuǎn)換成機(jī)器碼。NativeRuntime將C#、F#或VB代碼直接轉(zhuǎn)換為原生機(jī)器碼直接運(yùn)行。BCLBCL即BaseClasslibrary基礎(chǔ)類,例如File、System、Console、XML、ADO.NET、日期時(shí)間等類庫(kù)。AppModel提供上層應(yīng)用產(chǎn)品開(kāi)發(fā),Web應(yīng)用、游戲開(kāi)發(fā)、桌面程序、物聯(lián)網(wǎng)集成應(yīng)用等。

.NETCore是基于.NETFramework為基礎(chǔ),借鑒了其優(yōu)秀的思想與強(qiáng)大的功能,經(jīng)過(guò)重新設(shè)計(jì)與構(gòu)建,實(shí)現(xiàn)了.NETFramework中的部分功能(不包含WindowsUI部分),比如JIT、垃圾收集器(GC)、CLR、BCL等。.NetCore體系結(jié)構(gòu)詳解.NETcore簡(jiǎn)介.NETCore是由許多項(xiàng)目所組成,除了基本的類庫(kù)(CoreFX)之外,也包含采用RyuJIT編譯的運(yùn)行平臺(tái)CoreCLR、編譯器平臺(tái).NETCompilerPlatform、采用AOT編譯技術(shù)運(yùn)行最優(yōu)化的包CoreRT(.NETCoreRuntime),以及跨平臺(tái)的MSIL編譯器LLILC(LLVM-basedMSILCompiler)等項(xiàng)目。.NetCore核心組成NetCompilerPlatform:RoslynCoreFX.NET

Standard

LibrayCoreCLRCoreRTASP.NETCoreUWP應(yīng)用層中間層底層.NETcore簡(jiǎn)介.NetCore核心組成【應(yīng)用層】開(kāi)發(fā)框架開(kāi)發(fā)框架是開(kāi)發(fā)基于UI應(yīng)用的框架集,包括了ASP.NETCore(用于創(chuàng)建WebApp),和UWP(用于創(chuàng)建Windows10App)等?!局虚g層】核心類庫(kù)CoreFX(.NETCoreLibraries):CoreFX主要包含數(shù)個(gè)公共庫(kù),例如System.Collections,System.IO,System.Xml等。CoreFX是.NETStandardLibrary的實(shí)現(xiàn),同樣的.NETFramework4.6.3也是基于.NETStandardLibrary的實(shí)現(xiàn)。.NETcore簡(jiǎn)介.NetCore核心組成【底層】編譯器

CoreCLR:CoreCLR移植.NETFramework的CLR的功能,包含核心程序庫(kù)mscorlib、JIT編譯器、垃圾收集器(GC)以及其他運(yùn)行MSIL所需要的運(yùn)行期環(huán)境。核心功能包括:內(nèi)存管理、程序集加載、安全性、異常、線程管理等。CoreRT:CoreRT是以AOT(Ahead-of-time)編譯方式為主的核心功能,在.NETCore內(nèi)稱為CoreRT,在UWP則是稱為.NETNative。CoreRT會(huì)在建造時(shí)期(非運(yùn)行期)在編譯時(shí)將MSIL轉(zhuǎn)換成平臺(tái)本地的機(jī)器碼,以獲取較短的引導(dǎo)時(shí)間(JIT采用的是運(yùn)行時(shí)期編譯,使得引導(dǎo)時(shí)間拉長(zhǎng)),以及內(nèi)存用量減少的優(yōu)點(diǎn)。CoreRT會(huì)在不同的平臺(tái)使用不同的AOT技術(shù):

·Windows上使用的是.NETNative。

·macOS與Linux上使用的是LLILC(同時(shí)支持JIT和AOT)。Roslyn:.NETCompilerPlatform(項(xiàng)目代碼為Roslyn)s是一個(gè)開(kāi)源的跨平臺(tái)源代碼編譯器。它是將.NET平臺(tái)的編譯架構(gòu)標(biāo)準(zhǔn)化的平臺(tái),它可提供程序管理工具(如集成開(kāi)發(fā)環(huán)境)相當(dāng)多的情報(bào),用以發(fā)展有助于編寫(xiě)程序與管理程序結(jié)構(gòu)所需要的功能,例如類型信息、語(yǔ)法結(jié)構(gòu)、參考鏈接、語(yǔ)義、編譯器、自動(dòng)化、錯(cuò)誤回報(bào)等等功能,只要是遵循CLI標(biāo)準(zhǔn)的編程語(yǔ)言,都可以利用.NETCompilerPlatform實(shí)現(xiàn)出編譯器,讓程序管理工具能實(shí)現(xiàn)如語(yǔ)法提示、語(yǔ)法自動(dòng)完成、關(guān)鍵字高亮等可視化能力。.Netcore簡(jiǎn)介跨平臺(tái).NETCore是一個(gè)跨平臺(tái)的開(kāi)源框架,它允許開(kāi)發(fā)人員在不同的操作系統(tǒng)上構(gòu)建和運(yùn)行應(yīng)用程序。以前的.NETFramework主要針對(duì)Windows平臺(tái),而.NETCore則支持Windows、macOS和Linux。通過(guò)使用.NETCore,開(kāi)發(fā)人員可以編寫(xiě)一次代碼,然后在不同的操作系統(tǒng)上運(yùn)行它,而無(wú)需進(jìn)行大量的修改。這為開(kāi)發(fā)人員提供了更大的靈活性和可移植性,使他們能夠更輕松地開(kāi)發(fā)跨平臺(tái)的應(yīng)用程序。跨平臺(tái)是.NETCore的一個(gè)重要特性,使開(kāi)發(fā)人員能夠在不同的操作系統(tǒng)上構(gòu)建和部署應(yīng)用程序,無(wú)論是在開(kāi)發(fā)桌面應(yīng)用程序、Web應(yīng)用程序還是云服務(wù),都能夠獲得更大的靈活性和可擴(kuò)展性。.Netcore簡(jiǎn)介.NetCore優(yōu)勢(shì)(1)開(kāi)源、跨平臺(tái):.NETCore是開(kāi)放源代碼通用開(kāi)發(fā)平臺(tái),由Microsoft和.NET社區(qū)在GitHub上共同維護(hù)。它跨平臺(tái)(支持Windows、macOS和Linux),用于構(gòu)建web應(yīng)用、IOT應(yīng)用和移動(dòng)后端應(yīng)用。(2)性能優(yōu)越。據(jù).netcore團(tuán)隊(duì)給出來(lái)的性能測(cè)試數(shù)據(jù)來(lái)看,Acore(.netcore)相比與原來(lái)的Web(.netframework4.6)程序性能提升了2300%。跟python、java等相同環(huán)境比較,性能都要優(yōu)越。(3)內(nèi)置依賴注入(4)輕量級(jí)和模塊化的HTTP請(qǐng)求管道(中間件)(5)能夠在IIS上運(yùn)行或在自宿主(self-host)的進(jìn)程中運(yùn)行03.NetCore依賴注入.NetCore依賴注入為什么要用依賴注入什么是依賴注入,為什么要使用呢?簡(jiǎn)單通俗說(shuō)就是一個(gè)類需要另一個(gè)類來(lái)協(xié)助工作,就產(chǎn)生了依賴,所以需要的依賴項(xiàng)就要【注入】過(guò)來(lái)一起來(lái)協(xié)同完成工作。軟件設(shè)計(jì)原則中有一個(gè)依賴倒置原則(DIP)講的是要依賴于抽象,不要依賴于具體,高層模塊不應(yīng)該依賴于低層模塊,二者應(yīng)該依賴于抽象。簡(jiǎn)單的說(shuō)就是為了更好的解耦。而控制反轉(zhuǎn)(Ioc)就是這樣的一個(gè)實(shí)現(xiàn)思路,這個(gè)思路的其中一種實(shí)現(xiàn)方式就是依賴注入(DI)。依賴注入的理解與應(yīng)用.NetCore依賴注入為什么要用依賴注入依賴注入的理解與應(yīng)用感覺(jué)有點(diǎn)繞,舉個(gè)栗子:老李是一個(gè)維修工,現(xiàn)在要出任務(wù)去維修,得先去申領(lǐng)個(gè)扳手。老李:"請(qǐng)給我一把可以擰7mm大小的六角螺絲的扳手.",然后庫(kù)管老張就從倉(cāng)庫(kù)里拿了一把這樣的大力牌扳手給老李。.NetCore依賴注入為什么要用依賴注入在這個(gè)例子中,維修工老李只要告訴庫(kù)管我要一個(gè)"可以擰7mm大小的六角螺絲"的扳手即可,他不用關(guān)心扳手的品牌和樣式,也不用采購(gòu)扳手,更不用關(guān)心這個(gè)扳手是怎么來(lái)的。而對(duì)于庫(kù)管,他只需提供滿足這樣規(guī)則的一個(gè)扳手即可,不用去關(guān)心老李拿著這個(gè)扳手之后去干什么。所以老李和老張都只是關(guān)心"可以擰7mm大小的六角螺絲的"這個(gè)規(guī)則即可,也就是說(shuō),如果后期倉(cāng)庫(kù)里不再提供大力牌扳手,而是提供了這樣的大牛牌扳手,無(wú)論換了什么牌子和樣式,只要仍滿足這個(gè)規(guī)則,老李仍然可以正常工作。它們定義了一個(gè)規(guī)則(比如接口IWrench7mm),二者都依賴于這個(gè)規(guī)則,然后倉(cāng)庫(kù)無(wú)論提供大力牌(WrenchDaLi:IWrench7mm)還是大牛牌(WrenchDaNiu:IWrench7mm),都不影響正常工作.依賴注入的理解與應(yīng)用.NetCore依賴注入為什么要用依賴注入這就是依賴倒置原則(DIP),不依賴于具體(牌子),高層模塊(老李)不應(yīng)該依賴于低層模塊(大力牌扳手),二者應(yīng)該依賴于抽象(IWrench7mm:可以擰7mm大小的六角螺絲)。如果直接由老李去獲取(new)大力牌扳手,那么當(dāng)業(yè)務(wù)改變要求采用大牛牌的時(shí)候,我們就要去修改老李的代碼。為了解耦,在本例中我們只要在配置中讓倉(cāng)庫(kù)由原來(lái)的提供大力牌改為提供大牛牌即可。老李要使用的時(shí)候,可以通過(guò)注入(構(gòu)造器、屬性、方法)的方式,將倉(cāng)庫(kù)提供的扳手實(shí)例提供給老李使用。依賴注入的理解與應(yīng)用.NetCore依賴注入依賴注入理解引入依賴注入的目的是為了解耦。說(shuō)白了就是面向接口編程,通過(guò)調(diào)用接口的方法,而不直接實(shí)例化對(duì)象去調(diào)用。這樣做的好處就是如果添加了另一個(gè)種實(shí)現(xiàn)類,不需要修改之前代碼,只需要修改注入的地方將實(shí)現(xiàn)類替換。上面說(shuō)的通過(guò)接口調(diào)用方法,實(shí)際上還是需要去實(shí)例化接口的實(shí)現(xiàn)類,只不過(guò)不需要我們手動(dòng)new構(gòu)造實(shí)現(xiàn)類,而是交給如微軟的DI、Autofac這些工具去構(gòu)建實(shí)現(xiàn)類。我們只需要告訴它們,某個(gè)類是某個(gè)接口的實(shí)現(xiàn)類,當(dāng)用到的時(shí)候,工具(比如,微軟的DI)會(huì)自動(dòng)通過(guò)構(gòu)造函數(shù)實(shí)例化類。依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入打開(kāi)Startup這個(gè)文件,看一下里面的ConfigureServices方法。顧名思義,這個(gè)方法是用來(lái)配置服務(wù),系統(tǒng)默認(rèn)已經(jīng)添加了一些服務(wù),剩下的就是我們把自己需要的用的添加進(jìn)去。參數(shù)為服務(wù)集合IServiceCollection對(duì)象,這種對(duì)象提供了AddSingleton、AddScoped和AddTransient三種方法來(lái)添加服務(wù),三種方法添加的服務(wù)的生命周期不一樣。依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入添加一個(gè)名為DIDemo的.NETCOREMVC項(xiàng)目,在該項(xiàng)目下創(chuàng)建一個(gè)服務(wù)文件夾(Servers)(1)定義接口Icount(2)實(shí)現(xiàn)接口類Count至此,服務(wù)(類)有了,那么如何能讓這個(gè)服務(wù)為我們所用呢?或者說(shuō)為我們服務(wù)呢?依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入(3)把類(服務(wù))在Startup文件中通過(guò)ConfigureServices方法注入服務(wù)。使用容器的好處,由容器來(lái)統(tǒng)一管理實(shí)例的創(chuàng)建和銷毀,你只需要關(guān)心怎么用就行了,不需要關(guān)系怎么創(chuàng)建跟銷毀。當(dāng)然容器創(chuàng)建的實(shí)例都是有生命周期的。三種創(chuàng)建方法創(chuàng)建的實(shí)例生命周期不一樣。? Transient:瞬態(tài)模式,每一次訪問(wèn)都會(huì)創(chuàng)建一個(gè)新的實(shí)例? Scoped:域模式,在同一個(gè)Scope內(nèi)只初始化一個(gè)實(shí)例,可以理解為(每一個(gè)request級(jí)別只創(chuàng)建一個(gè)實(shí)例,同一個(gè)httprequest會(huì)在一個(gè)scope內(nèi))。對(duì)象在一次請(qǐng)求中是相同的,但在不同請(qǐng)求中是不同的。? Singleton:?jiǎn)卫J剑麄€(gè)應(yīng)用程序生命周期以內(nèi)只創(chuàng)建一個(gè)實(shí)例依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入常用注入方式有三種如下:publicvoidConfigureServices(IServiceCollectionservices){ …… //下面先以AddScopend方法闡述下常用的三種注入方式

//1.最常用的注入方式,以接口形式暴露服務(wù)。下面2中方式意思一樣

//1.1AddScopend后面是(),里面的接口和實(shí)現(xiàn)類必須套一層typeof services.AddScoped(typeof(ICount),typeof(Count)); //1.2AddScopend后面是<>,里面就直接寫(xiě)接口和實(shí)現(xiàn)類,當(dāng)然最后有一個(gè)() services.AddScoped<ICount,Count>(); //2.自己注入自己,以實(shí)現(xiàn)形式暴露服務(wù)

services.AddScoped(typeof(Count)); services.AddScoped<Count>(); //3.需要傳參的構(gòu)造函數(shù)的類的注入(后面實(shí)例有應(yīng)用講解)

//services.AddScoped(typeof(ICount),sp=>{returnnewCount(參數(shù));}); //services.AddScoped<ICount>(sp=>{returnnewCount(參數(shù));}); ……}依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入(4)接下來(lái)分析演示三種注入方法的區(qū)別:上面ConfigureServices方法中保留下面的瞬態(tài)模式//第1種:瞬態(tài)模式,每一次訪問(wèn)都會(huì)創(chuàng)建一個(gè)新的實(shí)例services.AddTransient<ICount,Count>();服務(wù)注入之后,我們就要用它。切換到控制器。那么能把服務(wù)實(shí)例注入到控制器中來(lái)呢?有屬性注入、構(gòu)造方法注入、方法注入。這里一般會(huì)用構(gòu)造方法注入。依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入publicclassHomeController:Controller{privateICount_count;//方便本類其他方法的調(diào)用,所以定義一個(gè)私有字段來(lái)接收

publicHomeController(ICountcount)//通過(guò)構(gòu)造方法注入實(shí)例,ASP.NETCORE內(nèi)置了依賴注入容器

{_count=count;}//說(shuō)明:請(qǐng)求到home控制器,自然調(diào)用home控制器的構(gòu)造方法,構(gòu)造方法中需要一個(gè)ICount類型的對(duì)象,它怎么來(lái)的呢?這就是因?yàn)?NETCore內(nèi)置了依賴注入容器,這個(gè)時(shí)候就會(huì)到StartUp.cs文件中的ConfigureServices方法中去找相應(yīng)的依賴,而在那里告訴了ICount由Count來(lái)實(shí)現(xiàn)(services.AddTransient<ICount,Count>();),所以這時(shí)會(huì)去調(diào)用Count的構(gòu)造方法實(shí)例化Count對(duì)象。

//接下來(lái)就可以在控制器中使用_countpublicIActionResultIndex(){intc=_count.MyCount();ViewBag.count=c;returnView();} ……}依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入前端展示:運(yùn)行效果,不斷刷新頁(yè)面也總是0,因?yàn)樗矐B(tài)模式注入的服務(wù),每一次訪問(wèn)都會(huì)創(chuàng)建一個(gè)新的實(shí)例。依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入上面ConfigureServices方法中改為下面的單例模式//第2種:?jiǎn)卫J剑麄€(gè)應(yīng)用程序生命周期以內(nèi)只創(chuàng)建一個(gè)實(shí)例services.AddSingleton<ICount,Count>();運(yùn)行效果,不斷刷新頁(yè)面不斷增加1.依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入繼續(xù)把上面ConfigureServices方法中改為下面的域模式//第3種:域模式,在同一個(gè)Scope內(nèi)只初始化一個(gè)實(shí)例,可以理解為(每一個(gè)request級(jí)別只創(chuàng)建一個(gè)實(shí)例,同一個(gè)httprequest會(huì)在一個(gè)scope內(nèi))services.AddScoped<ICount,Count>();運(yùn)行效果,不斷刷新頁(yè)面一直保持為0,因?yàn)槊看嗡⑿马?yè)面都是一個(gè)新的請(qǐng)求,所以總是0,在一個(gè)請(qǐng)求內(nèi)產(chǎn)生的實(shí)例對(duì)象才是唯一。依賴注入的理解與應(yīng)用.NetCore依賴注入依賴的服務(wù)如何注入改進(jìn)下測(cè)試代碼publicclassHomeController:Controller{privateIServiceProvider_provider;privateICount_count;//方便本類其他方法的調(diào)用,所以定義一個(gè)私有字段來(lái)接收

publicHomeController(ICountcount,IServiceProviderprovider)//通過(guò)構(gòu)造方法注入實(shí)例,ASP.NETCORE內(nèi)置了依賴注入容器

{_count=count;_provider=provider;}publicIActionResultIndex()//接下來(lái)就可以在控制器中

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論