.net core的學習小結

課程:【.NET 6教程,.Net Core 2022視頻教程,楊中科主講】 https://www.bilibili.com/video/BV1pK41137He/?p=159&share_source=copy_web&vd_source=d944df449598b7e51bbc29cddb033275
 
一:.net core 初識
asp.net core 與傳統asp.net form相比,更輕量級,運行速度更快,不與iis耦合,能跨平臺。
傳統的.netframework依賴 framework運行庫,而這種傳統的運行庫,是系統級的,操作系統上所有依賴與這個運行庫的軟件都受到這個運行庫影響,會出現軟件的兼容衝突問題,而.net core 能獨立部署,同一臺操作系統上的不同.net core程序獨立部署就不會相互影響,這種方式更能符合現如今的趨勢。
.net standard是一種實現標準,規範,在.net core 運行時庫裏這種庫是沒有具體的實現代碼,在不同的操作系統下,是由不同的代碼邏輯去構造.net core的實現,比如傳統的與.net core的實現是由不同路徑下的dll實現的,並且用反編譯軟件查看其代碼,發現實現代碼是有差異的;而我們在寫自己的 standard庫時,及非.net系統standard庫時,這個standard是有具體實現代碼的。
從standard2.1開始,不在支持傳統的.net framework了。standard1.0支持.net framework4.5。
.net core程序的發佈可以獨立發佈和依賴發佈,獨立是不需要安裝運行時的,而依賴是需要安裝.net core運行時的。
NuGet是一種組件包安裝工具,管理組件的依賴關係,能對組件進行升級和降級卸載等操作,幫助開發者更高效的複用組件,提高了開發效率。
.net官方網站:dotnet.microsoft.com
二:異步編程
異步編程,不等同於多線程,它內部的實現是一種switch的狀態機,不會加快程序的運行速度。我的理解是,異步在於,服務與當前執行的代碼的線程遇到了task時,就不會等待這個task任務執行完畢,順序執行下去,而是如果這個task耗時稍微長一段時間,那麼之前的線程會被線程池調去做其他任務,等await結束後,線程池會再叫一個線程服務當前執行的代碼,這個服務線程就是系統執行代碼的線程了,不是我們自己建立的線程。
舉個例子來說,當在winform中,使用task await執行耗時任務時,是不會阻塞ui線程的執行的,我覺得是ui線程在遇到task時,就不會繼續等待這個任務執行了,而是會準備響應ui的其他事件的觸發,比如拖動,點擊界面這些事件。
在asp.net core中,web服務器裏與web程序的交互中,當web程序裏有異步時,web服務器的服務線程不會因爲web程序執行耗時操作,而在那兒等待,它會處於活動狀態,接收web程序新的操作,這樣的好處是,同樣的web服務器支持的最大併發數,但是異步會提高這個併發的性能。
在異步中,不要用sleep,而是用task.dely(),sleep是阻止服務線程的執行,就會減少併發,而task.dely纔是阻止當前任務的執行,不會阻塞服務與代碼的線程。
CancellationToken可以提前終止異步任務的執行。
async 關鍵字,會把方法編譯成狀態機的語句,這樣會降低執行效率,所以當task不需要awiat操作的時候,就不要加async關鍵字。
當異步遇到yield時,需要用 IAsyncIEnumerable 關鍵字,yieid關鍵字也會把代碼轉爲狀態機模式。
三、LinqToObject和委託事件
linq 內部使用方法委託,完成對集合的操作。委託是把方法當成變量進行傳遞,一些回調函數也就是使用的方法委託。委託可用系統提供的Actoin和Func來簡化代碼。委託使用的地方非常的多。事件利用了委託,事件包含事件源(發佈者,觸發事件的源頭)和訂閱者(響應事件的具體方法),事件相當於是觀察者模式,能對代碼進行解耦,事件用得非常得多。事件可以讓類或者對象通知訂閱了事件的其他對象和類。事件可以註冊也可以取消訂閱。
四、控制反轉與依賴注入
控制反轉的意思,是把創建對象的主動權交給容器。其目的是解耦,讓開發者只需在需要時,注入對象,而不需要自己去創建。依賴注入(Dependency Injection,DI)是實現控制反轉的其中一種方式,還有一種是服務定位器(ServiceLocator)。服務定位器需要自己通過代碼去獲取對象,而DI直接可以在構造函數聲明形參,然後再構造函數內部賦值成員變量就行了,他們的前提是在容器內注入了對象。
依賴注入的聲明週期分爲:transient scope single 解釋分別是瞬時、一定範圍、單例。我的理解是,瞬時,每次通過注入獲取的對象都是最新創建的;一定範圍,在作用範圍內,多次獲取的對象是同一個,在asp.net core 中 使用scope注入對象,則同一個請求,多次注入都是獲得的同一個對象;單例,在程序的整個週期,在asp.net core中,單例在任何請求獲取的都是同一個對象。
五、系統配置
在.net core 中,支持多種配置系統 :文件、環境變量、控制檯等。可以把日誌的參數綁定到一個類對象。
日誌還能夠在使用快照選項時在文件更改時,在下一次請求裏就被更新,而不需要重啓程序。
對於環境變量,命令行,支持json扁平化的配置。
可以自定義代碼解析自己的配置類。詳見:Zack.AnyDBConfigProvider-main
六、日誌系統
日誌用於記錄系統運行時產生的信息,日誌根據信息的重要性分爲:Trace
日誌可以記錄在控制檯、文件、數據庫等。需要根據每天日誌的多少,設置每個日誌文件的大小,也可以設置日誌文件最大個數。
日誌還可以通過日誌等級過濾,記錄到不同文件裏。
SerialLog可以比Nlog更方便的實現json類型的日誌,以便分析。
七、EF.Core學習
它是跨平臺跨數據庫的orm框架,讓程序員不用寫太多原生sql,也不用考慮sql方言兼容問題。
使用時,結合code-first模式會更方便。
在實體配置上,有兩種方式,註解方式和fluentapi方式,前一種與實體定義耦合,後一種是不耦合的,更好。
在數據庫主鍵設置中,如果使用自動增長,會在分佈式數據庫中,會出現同表id重複的情況,在系統的表合併時,也會有這種情況出現。但是好處時,查詢速度快。使用guid,全球唯一,在分佈式系統中好用,缺點,無法索引,查詢速度慢。
它們可以綜合應用,設置自增列爲實際主鍵,但是也加入guid作爲代碼的邏輯主鍵。
sqlserver還獨有支持Hi/Lo算法,一次分配一個主鍵段,高併發,分佈式也不重複。
CodeFirst腳本遷移:Add-Migration XXX Update-Database XXX
更新到特定腳本(向上向下遷移):Update-Database –TargetMigration: AddBlogUrl
生成指定範圍的腳本:Script-Migration D F
可以使用 Scaffold-DbContext命令把已有數據庫表映射到項目
ef.core不能再where中使用一些自定義方法及一些複雜的方法雖然編譯沒問題,但是運行會報錯。
在efcore的關係配置中,會自動在數據庫創建外鍵列,但這樣使用外鍵列時,效率會變低,所以可以手動創建外鍵屬性映射到數據庫。
有時,er關係中,一對應的一方與很多其他類關聯,這時可以配置單項關係,不在一方定義list多方類的集合。
efcore支持配置自引用關係,添加一個父級id就行了,例子,菜單,組織架構。
在一對一關係中,必須顯示在一方指定一個外鍵。
IQueryable 是sql數據庫端處理數據,及篩選發生在數據庫裏,IEnumerable是代碼端處理數據,會把所有數據查出來,在內存裏篩選。IQueryable是延遲加載,只有真正使用到數據時,纔會查詢,IQueryable是可以複用的。
efcore還支持原生sql查詢。
efcore裏的實體狀態:已添加,已修改,已刪除,未改變,分離。首次跟蹤對象時,會創建快照,savechanges,對比值。這樣做,對象多了,佔內存,效率不高。
efcore是不支持批量新增和修改,刪除的,就是因爲這個實體狀態,如果批量操作,對象的狀態就會混亂。在批量操作中,已經刪除的對象,可能在efcore中不是已刪除的狀態,這時efcore一直都有的問題,這時就可以單獨寫sql語句完成批量操作。有個組件可以:Zack.EFCore.Batch,但還是不能解決對象狀態混亂的問題。
AsNotracking意思是不跟蹤狀態,查詢出來的對象,發生修改,刪除,efcore就不會跟蹤它們的狀態了,就無法在savechanges保存已經更改的對象。
在efcore中,可以設置全局查詢篩選器,所有查詢都會隱式帶上這個全局條件,比如使用邏輯刪除,就不用每次都寫未刪除查詢條件,也可以在查詢中忽略全局條件。
八、鎖
悲觀鎖:更新數據時,鎖表或者鎖行,在這同時,其他需要操作此表或此行數據的操作被阻塞,雖然操作簡單,但併發低,不好。
樂觀鎖:更新數據時,不鎖表鎖行,更新時帶個查詢此列值得條件,這樣做,當這個值發生改變,其他更新就找不到要更新的對象,影響行數就爲0,就能提醒程序,或通過拋異常的方式。代碼層面就可以再次重新查詢出新值,再更新。支持高併發,但有aba的問題。更新多列,就比較麻煩。可以使用併發令牌來充當更新的where條件,因爲每次操作數據庫,其併發令牌列的值都會變。mysql中用datetime類型的屬性設置併發列。
九、REST
面向資源的接口定義。
十、緩存
緩存分爲客戶端緩存,服務端頁面緩存和內存緩存。
緩存穿透:數據庫和緩存中都不存在的數據卻訪問量很高,但不命中緩存。特殊值也設置緩存
緩存雪崩:同一時間,大部分緩存失效。設置隨機過期時間。
緩存擊穿:單個熱點key值失效,給數據庫帶來壓力。
緩存應用:菜單,權限,熱門商品,高頻率訪問數據庫的請求。
十一、Filter與Middleware
filter是實現aop編程的一種方式。filter是屬於一個middlerware的,middleware是更底層的方法,filter是控制器層面的,能拿到控制器層面的數據,而middleware不能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章