本篇文章將帶你認識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
5.2-Log4Net組件使用
(1)管理Nuget程式,下載【log4net】和【Microsoft.Extensions.Logging.Log4Net.AspNetCore】
(2)新建一個文件夾,保存log4net配置文件,一定要在【屬性】中的 複製到輸出目錄 選擇【始終複製】。
(3)在【Program.cs】文件的【CreateHostBuilder】方法中配置log4net。
也可以使用以下方式配置(在Startup中):
這裡註意,別選擇錯了!然後就可以了。
六、程式的發佈運行
6.1-項目的發佈
(1)右擊項目,選擇【發佈】
(2)選擇【文件夾】
(3)選擇要保存的路徑,然後點擊【完成】;
(4)點擊【發佈】,可以看到已經發佈完成了。
6.2-項目的運行
6.2.1-IIS發佈
- IIS直接簡歷網站,目錄指向項目跟目錄下的Debug、Net5文件;——不行
- 把項目發佈後,目錄指向項目發佈目錄;——可以的
6.2.2-ASP.NET Core跨平臺原因
6.2.3-使用腳本啟動網站
6.2.4-發佈之後運行為什麼樣式載入不出404?
(1)需要在【startup.cs】文件的【Configure】方法中引入一個中間件。
七、命令參數讀取+配置多種讀取
7.1-配置文件讀取(1)
在【startup.cs】文件中讀取配置文件
在【控制器】中讀取配置文件。
(1)先構造函數註入Configure
(2)寫代碼獲取
7.2-配置文件讀取(2)
(1)定義一個類,結構(數據類型、屬性名)和配置文件中完全一致。
(2)在【Startup.sc】配置一下
(3)在控制器中,構造函數註入一個IOptions
(4)獲得並返回值
(5)前端獲取值
八、MVC開發
8.1-什麼是MVC?
- V——View——視圖:呈現給用戶看到的內容(表現層)
- C——Controller——控制器:控制業務邏輯計算,調用服務,選擇返回什麼內容,可以返回視圖,JSON、字元串等等。
- M——Model——視圖模型:用作控制器和視圖之間傳遞數據的載體。
8.2-cshtml文件
其實是一個類文件。
Razor混編:可以在cshtml上寫 後臺C#代碼 + 前臺html代碼,混合起來寫;
(1)可以引入命名空間
(2)直接寫後臺代碼
(3)實現介面
(4)可以依賴註入
(5)可以添加特性Class
(6)定義方法並調用
(7)寫單行代碼、多行代碼
(8)Razor表達式
(9)輸出尖括弧
(10)for迴圈
(11)在後臺代碼內部寫HTML代碼
8.3-如何解決修改視圖後無需編譯後即可生效?
修改視圖,增加了html代碼,不能馬上生效,怎麼辦?使用中間件
1.引入Nuget包
2.在【Startup.cs】文件的票【ConfigureServices】方法中配置。
8.4-Razor佈局
8.4.1-我們看到的頁面組成到底有哪些內容?
答:包含了Layout的模板嵌套的返回的需要渲染的視圖內容;
8.4.2-如何嵌套呢?
答:通過Layout中RendBody()方法做了替換;把返回的視圖替換到模板也中,形成了一整塊的內容;目的在於每一次返回不同的頁面的時候,能夠吧不變的視圖部分,種以重用;這樣就可以少些代碼。
8.4.3-在模板頁面導入了JQ,在視圖頁面使用JQ為什麼報錯?
註意:
- 在模板頁中使用CSS/JS的時候,為了提高效率,會把Css引入在模板的上方,將JS寫在模板的下方。頁面嵌套到模板頁後,就會出現在引用JS的上方調用JS,此時JS其實是調用不了的。
答:因為Script是寫在下麵的,先載入RenderBody,後載入JQ,所以會報錯,解決方法如下:
九、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方法。
2.在【_ViewImports.cshtml】進行註冊
3.使用
9.3-Razor局部視圖
1.創建一個局部視圖
2.進行調用
9.3.1-局部視圖的缺陷:
局部視圖沒有去訪問控制器中的Action,所以不能完美的實現後臺代碼。可以使用視圖組件解決。
9.4-視圖組件-擴展定製
9.4.1-視圖組件的優點?
- 呈現頁面相應的某一部分而不是整個相應
- 包括在控制器和視圖之間發現的關註分離和可測試性優勢
- 可以具有參數和業務邏輯
- 通常在頁面佈局中調用
9.4.2-如何自定義視圖組件?
(1)Rzaor組件對應的類需要以ViewComponent結尾,該類需要繼承自ViewCompnent類。
(2)定義一個非同步版本的InvokeAsync,可以自定義參數,IncokeAsync就是返回組件內容的方法。
(3)在Views/Shared文件下建立Components文件夾,在這個文件下創建一個和組件類名相同(如果加了特性,就按照特性上面的名稱來)的文件夾,然後創建一個Default.cshtml視圖。
註意:以上步驟可以不按照上面執行,我們可以隨意新建一個視圖,然後指定路徑就可以了。
(4)調用
十、內置容器基本使用
10.1-什麼是IOC?
把對象的創建,統一交給第三方容器來創建;
10.2-如何使用IOC?
(1)在【Startup.cs】的【ConfigureServices】中註冊服務;註冊抽象和具體的依賴關係;
(2)通過構造函數進行依賴註入,自動得到服務的實例;
(3)調用;
10.3-如何使用IOC?(第二種方法)
(1)在【Startup.cs】的【ConfigureServices】中註冊服務;註冊抽象和具體的依賴關係;
(2)通過構造函數進行依賴註入。
(3)調用;
10.4-在視圖中使用IOC
10.4-什麼是依賴註入?
DI依賴註入:IServiceCollection支持且支持構造函數註入。
如對象A依賴對象B,對象B依賴於對象C,就可以先構造對象C,然後傳遞給對象B,然後傳遞給對象A,然後得到具體的實例。可以支持無限層級的依賴註入,前提是先要先註入服務(註冊抽象和具體的映射關係)。
10.5-IServiceCollection生命周期
那麼在創建對象的時候, 不同的情況,需要讓對象單例,每一次都創建新的對象實例,不同的作用於創建新的實例。
AddTransient:順時聲明周期,每次獲取的都是不同的實例
AddSingleton:單例生命周期,在整個進程中獲取的都是同一個實例
AddScoped:作用域生命周期(同一個作用域,獲取的是同一個對象的實例,不同的作用域,獲取的是不同的獨對象實例)
建議:開發工作中,一般情況下,都是一個請求一個對象的實例,所以使用的是順時聲明周期(AddTransient)。
十一、Autofac容器
11.1-Autofac容器初識?
Autofac也是一款流行的IOC容器;
11.2-如何使用Autofac容器?
(1)管理Nuget程式包,下載並安裝【Autofac】
(2)在【Startup.cs】的【ConfigureServices】中註冊服務;
11.3-Autofac註入方式-構造函數註入
11.4-Autofac註入方式-屬性註入
11.5-Autofac註入方式-方法註入
11.6-Autofac生命周期-瞬時生命周期(預設)
瞬時生命周期:每一次獲取對象都是一個全新的實例,預設的生命周期。
11.7-Autofac生命周期-單例生命周期
單例聲明周期:在整個進程中,對象永遠都是同一個實例(SingleInstance)
11.8-Autofac生命周期-每個生命周期範圍一個實例
每個生命周期範圍一個實例:同一個生命周期範圍內是同一個實例,不同的生命周期範圍,實例不一樣。(InstancePerLifetimeScope)
11.9-Autofac生命周期-每個匹配生命周期範圍一個實例
語法:InstancePerMatchingLifetimeScope(名稱)
11.10-Autofac生命周期-每個請求一個實例
11.11-Autofac支持配置文件
(1)管理Nuget包,引入3個程式集;
(2)新建一個配置文件【autofac.json】,記得將配置文件設置為:始終複製到目錄。
(3)在【Startup.cs】的【ConfigureServices】中註冊服務;
11.12-Autofac整合MVC
註意:Autofac是一個第三方容器;
(1)指定Autofac工廠替換預設工廠,在【Program.cs】中的【CreateHostBuilder】方法中指定。
(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)通過控制器構造函數註入,獲取實例。
這種方法也還能用:
11.13-Autofac支持控制器屬性註入
(1)首先在【Startup.cs】中【ConfigureServices】方法中,指定控制器實例容器來創建,進行替換。
(2)創建一個類(特性);
(3)創建一個類,用來判斷維度;
(4)在【Startup.cs】中創建一個【ConfigureContainer】方法,負責註冊各種服務。
11.14-Autofac一個實例多實現的問題
註意:
- 如果一個抽象多個實例,都註冊了,通過構造函數用抽象類型來獲取實例,哪個是後面註冊的,就能獲得哪個,覆蓋類型的。
- 如果一個抽象多個實例,都註冊了,可以通過一個IEnumerable<抽象類>,當做構造函數參數,可以獲取到左右註冊的具體的實例。
一般使用以下方法:
(1)在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊資源和實現(單抽象、多實現)
(2)通過構造函數中,使用具體理性實理性做我參數,可以匹配到不同的具體類型實例。
(1)新建一個類,該類繼承Module類,實現Load方法。
(2)與之前相同,不同的而方式:在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊資源和實現(單抽象、多實現)
11.15-Autofac通過抽象(介面)支持AOP(面向切麵編程-做應用型系統)
AOP-面向切麵編程:不用修改之前代碼的基礎上,可以動態的在某個動作之前加一些操作,動態的在某一個動作之後做點什麼事。
(1)管理Gurget程式包,下載【Castle.Core】包,該包用來動態代理。
(2)創建一個類為【CustomAutofacAop】,該類繼承自【IInterceptor】介面,並實現介面中的【Intercept】方法。
(3)在服務的抽象上面做一個標記,這個標記是用來:支持AOP擴展能夠生效。
(4)因為這個【CustomAutofacAop】實例也是通過Autofac的IOC來做的,所以需要在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊服務,讓Autofac支持AOP。
11.16-Autofac通過類支持AOP
(1)管理Gurget程式包,下載【Castle.Core】包,該包用來動態代理。
(2)創建一個類為【CustomAutofacAopClass】,該類繼承自【IInterceptor】介面,並實現介面中的【Intercept】方法。
(3)在類上面做一個標記,這個標記是用來:支持AOP擴展能夠生效。
(4)因為這個【CustomAutofacAop】實例也是通過Autofac的IOC來做的,所以需要在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊服務,讓Autofac支持AOP。
11.17-Autofac單抽象多實現構造函數註入(MVC)
(1)在【Startup.cs】中創建的【ConfigureContainer】方法中,註冊服務。
(2)在控制器中調用。
11.18-Autofac單抽象多實現屬性註入
(1)道理和上面是一樣的,可以吧Autofac上下文當做屬性來註入。
(2)在使用的時候,通過Autofac上下文+不同註冊的標識,獲取到不同的具體實例。
上一章節: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