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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

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

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

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

select:用select子句指定目標數(shù)據(jù)LINQ查詢中,查詢結(jié)果本身則通過select或group子句來定義,其中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();}通過new創(chuàng)建了一個匿名類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子句實現(xiàn)排序LINQ中,通過orderby子句對查詢結(jié)果進行排序。定義如下:expression是要進行排序的表達式,sortType是可選參數(shù),表示排序類型,包括升序(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子句實現(xiàn)分組LINQ中,通過group子句對查詢結(jié)果進行分組,定義如下:expression是一個表達式,用于計算產(chǎn)生查詢結(jié)果中是一個表達式,by用于計算產(chǎn)生查詢結(jié)果中的元素,而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(); }}根據(jù)3的余數(shù)進行分組Linq查詢用并列from子句實現(xiàn)連接LINQ中,通過并列from子句可以從多個數(shù)據(jù)源中獲取數(shù)據(jù)并進行查詢,它的語法和單個from子句一樣,只是每個from子句的臨時變量名稱不能相同,每個臨時變量表示來自對應數(shù)據(jù)源的元素。多個from子句實際上可以看成是多次循環(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);}兩個from子句進行查詢,且from子句中的臨時變量intval1和intval2不能相同Linq查詢First()返回集合中的一個元素,其實質(zhì)就是在SQL語句中加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()返回集合中的一個元素,其實質(zhì)就是在SQL語句中加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()方法返回序列中的第一個元素,如果序列為空,則拋出InvalidOperationException異常。這意味著如果調(diào)用First()方法時序列為空,將會導致運行時異常。FirstOrDefault():

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

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

staticvoidMain(string[]args)

{int[]intAry1={100,12,78,12,78,60};varresultList=(fromintval1inintAry1selectintval1).Distinct();foreach(variteminresultList)System.Console.WriteLine(item);Console.ReadKey(); }去除重復數(shù)據(jù)Linq查詢Count()返回集合中的元素個數(shù),返回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的個數(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,因為numbers序列中存在元素返回true,因為numbers序列中存在偶數(shù)元素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序列中存在奇數(shù)元素返回true,因為emptyList序列中沒有元素,相當于所有元素都滿足條件Linq查詢Sum()返回集合中數(shù)值類型元素之和,集合應為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查詢,只是表達方式不同,但它們可以互相轉(zhuǎn)換。方法語句方法語句使用點號(.)來鏈接方法調(diào)用,每個方法調(diào)用都對應于一個LINQ操作

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

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

;其中,from關鍵字用于指定要查詢的集合,where關鍵字用于篩選滿足條件的元素,orderby關鍵字用于按照指定的屬性進行排序,select關鍵字用于選擇指定的屬性。查詢語句通過關鍵字和查詢變量的組合來描述整個LINQ查詢

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

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

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

Standard

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

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

·Windows上使用的是.NETNative。

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論