.NET5從零基礎到精通:全面掌握.NET5開發技能【第二章】

来源:https://www.cnblogs.com/kimiliucn/archive/2023/08/10/17620153.html
-Advertisement-
Play Games

本篇文章將帶你認識C#的新語法、創建項目、發佈運行、讀取的相關操作、MVC開發、擴展、各種容易的使用,許可權等.NET的相關知識。帶你從零到精通,全面掌握.NET5的開發技能。 ...


章節

第一章:https://www.cnblogs.com/kimiliucn/p/17613434.html
第二章:https://www.cnblogs.com/kimiliucn/p/17620153.html
第三章:https://www.cnblogs.com/kimiliucn/p/17620159.html


五、創建項目+Seesion傳值

5.1-使用Session

image.png


5.2-Log4Net組件使用

(1)管理Nuget程式,下載【log4net】和【Microsoft.Extensions.Logging.Log4Net.AspNetCore】
image.png
image.png
(2)新建一個文件夾,保存log4net配置文件,一定要在【屬性】中的 複製到輸出目錄 選擇【始終複製】。
image.png
(3)在【Program.cs】文件的【CreateHostBuilder】方法中配置log4net。
image.png
也可以使用以下方式配置(在Startup中):
這裡註意,別選擇錯了!然後就可以了。
image.png


六、程式的發佈運行

6.1-項目的發佈

(1)右擊項目,選擇【發佈】
image.png
image.png
(2)選擇【文件夾】
image.png
(3)選擇要保存的路徑,然後點擊【完成】;
image.png
(4)點擊【發佈】,可以看到已經發佈完成了。
image.png
image.png


6.2-項目的運行

6.2.1-IIS發佈

  • IIS直接簡歷網站,目錄指向項目跟目錄下的Debug、Net5文件;——不行
  • 把項目發佈後,目錄指向項目發佈目錄;——可以的

6.2.2-ASP.NET Core跨平臺原因
image.png

6.2.3-使用腳本啟動網站
image.png
image.png

6.2.4-發佈之後運行為什麼樣式載入不出404?
(1)需要在【startup.cs】文件的【Configure】方法中引入一個中間件。
image.png


七、命令參數讀取+配置多種讀取

7.1-配置文件讀取(1)

在【startup.cs】文件中讀取配置文件
image.png
在【控制器】中讀取配置文件。
(1)先構造函數註入Configure
image.png
(2)寫代碼獲取
image.png
image.png


7.2-配置文件讀取(2)

(1)定義一個類,結構(數據類型、屬性名)和配置文件中完全一致。
image.png
(2)在【Startup.sc】配置一下
image.png
(3)在控制器中,構造函數註入一個IOptions
image.png
(4)獲得並返回值
image.png
(5)前端獲取值
image.png
image.png


八、MVC開發

8.1-什麼是MVC?

  • V——View——視圖:呈現給用戶看到的內容(表現層)
  • C——Controller——控制器:控制業務邏輯計算,調用服務,選擇返回什麼內容,可以返回視圖,JSON、字元串等等。
  • M——Model——視圖模型:用作控制器和視圖之間傳遞數據的載體。

8.2-cshtml文件

其實是一個類文件。
Razor混編:可以在cshtml上寫 後臺C#代碼 + 前臺html代碼,混合起來寫;
(1)可以引入命名空間
image.png
(2)直接寫後臺代碼
image.png
(3)實現介面
image.png
(4)可以依賴註入
image.png
(5)可以添加特性Class
image.png
(6)定義方法並調用
image.png
(7)寫單行代碼、多行代碼
image.png

image.png
(8)Razor表達式
image.png
(9)輸出尖括弧
image.png
(10)for迴圈
image.png
(11)在後臺代碼內部寫HTML代碼
image.png


8.3-如何解決修改視圖後無需編譯後即可生效?

修改視圖,增加了html代碼,不能馬上生效,怎麼辦?使用中間件
image.png
1.引入Nuget包
image.png
2.在【Startup.cs】文件的票【ConfigureServices】方法中配置。
image.png


8.4-Razor佈局

8.4.1-我們看到的頁面組成到底有哪些內容?
答:包含了Layout的模板嵌套的返回的需要渲染的視圖內容;

8.4.2-如何嵌套呢?
答:通過Layout中RendBody()方法做了替換;把返回的視圖替換到模板也中,形成了一整塊的內容;目的在於每一次返回不同的頁面的時候,能夠吧不變的視圖部分,種以重用;這樣就可以少些代碼。
image.png

8.4.3-在模板頁面導入了JQ,在視圖頁面使用JQ為什麼報錯?
註意:

  • 在模板頁中使用CSS/JS的時候,為了提高效率,會把Css引入在模板的上方,將JS寫在模板的下方。頁面嵌套到模板頁後,就會出現在引用JS的上方調用JS,此時JS其實是調用不了的。

image.png
答:因為Script是寫在下麵的,先載入RenderBody,後載入JQ,所以會報錯,解決方法如下:
image.png


九、Razor擴展-HTML控制項

9.1-Html擴展控制項(1)

本質:通過一個後臺方法,返回一個【已經存在】的Html標簽的字元串,瀏覽器在讀取的時候,就讀取成一個Html標簽。
1.定義

 /// <summary>
        /// 圖片
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="src"></param>
        /// <returns></returns>
        public static IHtmlContent Img(this IHtmlHelper helper,string src,string @class)
        {
            return new HtmlString($"<img src='{src}'  class='{@class}'/>");
        }

2.調用

<!--1.引入命名空間-->

<!--2.使用圖片--自定義 擴展方法-->
@Html.Img("https://tpc.googlesyndication.com/simgad/3105023548593992165/downsize_200k_v1?w=200&h=200","border:1px solid red;")

9.2-Html擴展控制項(2)

通過一個後臺方法,返回一個【不存在】的Html標簽的字元串,在讀取的時候,通過制後臺方法,去生成我們制定的標簽。
1.寫一個擴展方法,定義一個普通類,類名建議以TagHelper結尾,加上特性;如果沒有標記特性,視圖中在調用的時候使用當前類名去掉TagHelper尾碼得到的的字元串來調用。繼承TagHelpre抽象類、或者實現介面ITagHelpr,二者選一起均可。然後實現介面Proccss方法。
image.png
2.在【_ViewImports.cshtml】進行註冊
image.png
3.使用
image.png


9.3-Razor局部視圖

1.創建一個局部視圖
image.png
2.進行調用
image.png

9.3.1-局部視圖的缺陷:
局部視圖沒有去訪問控制器中的Action,所以不能完美的實現後臺代碼。可以使用視圖組件解決。


9.4-視圖組件-擴展定製

9.4.1-視圖組件的優點?

  • 呈現頁面相應的某一部分而不是整個相應
  • 包括在控制器和視圖之間發現的關註分離和可測試性優勢
  • 可以具有參數和業務邏輯
  • 通常在頁面佈局中調用

9.4.2-如何自定義視圖組件?
(1)Rzaor組件對應的類需要以ViewComponent結尾,該類需要繼承自ViewCompnent類。
image.png
(2)定義一個非同步版本的InvokeAsync,可以自定義參數,IncokeAsync就是返回組件內容的方法。
image.png
(3)在Views/Shared文件下建立Components文件夾,在這個文件下創建一個和組件類名相同(如果加了特性,就按照特性上面的名稱來)的文件夾,然後創建一個Default.cshtml視圖。
image.png
註意:以上步驟可以不按照上面執行,我們可以隨意新建一個視圖,然後指定路徑就可以了。
image.png
(4)調用
image.png


十、內置容器基本使用

10.1-什麼是IOC?

把對象的創建,統一交給第三方容器來創建;


10.2-如何使用IOC?

(1)在【Startup.cs】的【ConfigureServices】中註冊服務;註冊抽象和具體的依賴關係;
image.png
(2)通過構造函數進行依賴註入,自動得到服務的實例;
image.png
(3)調用;
image.png


10.3-如何使用IOC?(第二種方法)

(1)在【Startup.cs】的【ConfigureServices】中註冊服務;註冊抽象和具體的依賴關係;
image.png
(2)通過構造函數進行依賴註入。
image.png
(3)調用;
image.png


10.4-在視圖中使用IOC

image.png


10.4-什麼是依賴註入?

DI依賴註入:IServiceCollection支持且支持構造函數註入。
如對象A依賴對象B,對象B依賴於對象C,就可以先構造對象C,然後傳遞給對象B,然後傳遞給對象A,然後得到具體的實例。可以支持無限層級的依賴註入,前提是先要先註入服務(註冊抽象和具體的映射關係)。


10.5-IServiceCollection生命周期

那麼在創建對象的時候, 不同的情況,需要讓對象單例,每一次都創建新的對象實例,不同的作用於創建新的實例。
AddTransient:順時聲明周期,每次獲取的都是不同的實例
image.png
AddSingleton:單例生命周期,在整個進程中獲取的都是同一個實例
image.png
AddScoped:作用域生命周期(同一個作用域,獲取的是同一個對象的實例,不同的作用域,獲取的是不同的獨對象實例)
image.png
建議:開發工作中,一般情況下,都是一個請求一個對象的實例,所以使用的是順時聲明周期(AddTransient)。


十一、Autofac容器

11.1-Autofac容器初識?

Autofac也是一款流行的IOC容器;


11.2-如何使用Autofac容器?

(1)管理Nuget程式包,下載並安裝【Autofac】
image.png
(2)在【Startup.cs】的【ConfigureServices】中註冊服務;
image.png


11.3-Autofac註入方式-構造函數註入

image.png
image.png


11.4-Autofac註入方式-屬性註入

image.png
image.png


11.5-Autofac註入方式-方法註入

image.png
image.png


11.6-Autofac生命周期-瞬時生命周期(預設)

瞬時生命周期:每一次獲取對象都是一個全新的實例,預設的生命周期。
image.png


11.7-Autofac生命周期-單例生命周期

單例聲明周期:在整個進程中,對象永遠都是同一個實例(SingleInstance)
image.png


11.8-Autofac生命周期-每個生命周期範圍一個實例

每個生命周期範圍一個實例:同一個生命周期範圍內是同一個實例,不同的生命周期範圍,實例不一樣。(InstancePerLifetimeScope)
image.png


11.9-Autofac生命周期-每個匹配生命周期範圍一個實例

語法:InstancePerMatchingLifetimeScope(名稱)
image.png


11.10-Autofac生命周期-每個請求一個實例

image.png


11.11-Autofac支持配置文件

(1)管理Nuget包,引入3個程式集;
image.png
(2)新建一個配置文件【autofac.json】,記得將配置文件設置為:始終複製到目錄。
image.png
image.png
(3)在【Startup.cs】的【ConfigureServices】中註冊服務;
image.png


11.12-Autofac整合MVC

註意:Autofac是一個第三方容器;
(1)指定Autofac工廠替換預設工廠,在【Program.cs】中的【CreateHostBuilder】方法中指定。
image.png
(2)在【Startup.cs】類中增加一個【ConfigureContainer】方法,用來註冊服務關係。

/// <summary>
/// 增加一個方法:
/// 整個方法被Autofac自動調用
/// 負責註冊各種服務
/// </summary>
/// <param name="services"></param>
public void ConfigureContainer(ContainerBuilder containerBuilder) {
    containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
    containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>();
    containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>();
    containerBuilder.RegisterType<TestServiceD>().As<ITestServiceD>().PropertiesAutowired();
    containerBuilder.RegisterType<TestServiceE>().As<ITestServiceE>();
}

(3)通過控制器構造函數註入,獲取實例。
image.png
這種方法也還能用:
image.png


11.13-Autofac支持控制器屬性註入

(1)首先在【Startup.cs】中【ConfigureServices】方法中,指定控制器實例容器來創建,進行替換。
image.png
(2)創建一個類(特性);
image.png
(3)創建一個類,用來判斷維度;
image.png
(4)在【Startup.cs】中創建一個【ConfigureContainer】方法,負責註冊各種服務。
image.png


11.14-Autofac一個實例多實現的問題

註意:

  • 如果一個抽象多個實例,都註冊了,通過構造函數用抽象類型來獲取實例,哪個是後面註冊的,就能獲得哪個,覆蓋類型的。
  • 如果一個抽象多個實例,都註冊了,可以通過一個IEnumerable<抽象類>,當做構造函數參數,可以獲取到左右註冊的具體的實例。

image.png
一般使用以下方法:
(1)在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊資源和實現(單抽象、多實現)
image.png
(2)通過構造函數中,使用具體理性實理性做我參數,可以匹配到不同的具體類型實例。
image.png

image.png
(1)新建一個類,該類繼承Module類,實現Load方法。
image.png
(2)與之前相同,不同的而方式:在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊資源和實現(單抽象、多實現)
image.png


11.15-Autofac通過抽象(介面)支持AOP(面向切麵編程-做應用型系統)

AOP-面向切麵編程:不用修改之前代碼的基礎上,可以動態的在某個動作之前加一些操作,動態的在某一個動作之後做點什麼事。
(1)管理Gurget程式包,下載【Castle.Core】包,該包用來動態代理。
image.png
(2)創建一個類為【CustomAutofacAop】,該類繼承自【IInterceptor】介面,並實現介面中的【Intercept】方法。
image.png
(3)在服務的抽象上面做一個標記,這個標記是用來:支持AOP擴展能夠生效。
image.png
(4)因為這個【CustomAutofacAop】實例也是通過Autofac的IOC來做的,所以需要在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊服務,讓Autofac支持AOP。
image.png


11.16-Autofac通過類支持AOP

(1)管理Gurget程式包,下載【Castle.Core】包,該包用來動態代理。
image.png
(2)創建一個類為【CustomAutofacAopClass】,該類繼承自【IInterceptor】介面,並實現介面中的【Intercept】方法。
image.png
(3)在類上面做一個標記,這個標記是用來:支持AOP擴展能夠生效。
image.png
(4)因為這個【CustomAutofacAop】實例也是通過Autofac的IOC來做的,所以需要在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊服務,讓Autofac支持AOP。
image.png


11.17-Autofac單抽象多實現構造函數註入(MVC)

(1)在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊服務。
image.png
(2)在控制器中調用。
image.png


11.18-Autofac單抽象多實現屬性註入

(1)道理和上面是一樣的,可以吧Autofac上下文當做屬性來註入。
image.png
(2)在使用的時候,通過Autofac上下文+不同註冊的標識,獲取到不同的具體實例。
image.png


上一章節:https://www.cnblogs.com/kimiliucn/p/17613434.html
下一章節:https://www.cnblogs.com/kimiliucn/p/17620159.html
原文地址:https://www.cnblogs.com/kimiliucn/p/17620153.html

版權聲明:本文為原創文章,版權歸 [西瓜程式猿] 所有,轉載請註明出處,有任何疑問請私信咨詢。
原文鏈接:https://www.cnblogs.com/kimiliucn/p/17620153.html

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • PeFile模塊是`Python`中一個強大的攜帶型第三方`PE`格式分析工具,用於解析和處理`Windows`可執行文件。該模塊提供了一系列的API介面,使得用戶可以通過`Python`腳本來讀取和分析PE文件的結構,包括文件頭、節表、導入表、導出表、資源表、重定位表等等。此外,PEfile模塊還... ...
  • 源碼請到:自然語言處理練習: 學習自然語言處理時候寫的一些代碼 (gitee.com) 數據來源: 搜狗新聞語料庫 由於鏈接失效,現在使用百度網盤分享 鏈接:https://pan.baidu.com/s/1RTx2k7V3Ujgg9-Rv8I8IRA?pwd=ujn3 提取碼:ujn3 停用詞 來 ...
  • ## 前言 C++可以動態的分類記憶體(但是得主動釋放記憶體,避免記憶體泄漏),而java並不能這樣,java的記憶體分配和垃圾回收統一由JVM管理,是不是java就不能操作記憶體呢?當然有其他辦法可以操作記憶體,接下來有請`Unsafe`出場,我們一起看看`Unsafe`是如何花式操作記憶體的。 ## Unsa ...
  • 來源:juejin.cn/post/7139202066362138654 昨天線上容器突然cpu飆升,也是第一次排查這種問題所以記錄一下~ ## 前言 首先問題是這樣的,周五正在寫文檔,突然收到了線上報警,發現cpu占用達到了90多,上平臺監控系統查看容器,在jvm監控中發現有一個pod在兩個小時 ...
  • 在.NET中,理解對象的記憶體佈局是非常重要的,這將幫助我們更好地理解.NET的運行機制和優化代碼,本文將介紹.NET中的對象記憶體佈局。 .NET中的數據類型主要分為兩類,值類型和引用類型。值類型包括了基本類型(如int、bool、double、char等)、枚舉類型(enum)、結構體類型(stru ...
  • 在開發`winfrom`應用時,經常遇到異常:`System.InvalidOperationException:“線程間操作無效: 從不是創建控制項“xxxx”的線程訪問它。`出現這個異常的原因是創建這個UI的線程,和當前訪問這個UI的線程不會是同一個。Winform為了防止線程不安全,因此對這個跨... ...
  • # Unity AssetPostprocessor模型相關函數詳解 在Unity中,AssetPostprocessor是一個非常有用的工具,它可以在導入資源時自動執行一些操作。在本文中,我們將重點介紹AssetPostprocessor中與模型相關的函數,並提供多個使用例子。 ## OnPost ...
  • OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的電腦視覺庫。OpenCV是由英特爾公司發起並參與開發,以BSD許可證授權發行,可以在商業和研究領域中免費使用。OpenCV可用於開發實時的圖像處理電腦視覺以及模式識別程式。該程式庫也可以使用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...