章節(jié)
第一章:https://www.cnblogs.com/kimiliucn/p/17613434.html
第二章:https://www.cnblogs.com/kimiliucn/p/17620153.html
第三章:https://www.cnblogs.com/kimiliucn/p/17620159.html
五、創(chuàng)建項(xiàng)目+Seesion傳值
5.1-使用Session
5.2-Log4Net組件使用
(1)管理Nuget程序,下載【log4net】和【Microsoft.Extensions.Logging.Log4Net.AspNetCore】
(2)新建一個(gè)文件夾,保存log4net配置文件,一定要在【屬性】中的 復(fù)制到輸出目錄 選擇【始終復(fù)制】。
(3)在【Program.cs】文件的【CreateHostBuilder】方法中配置log4net。
也可以使用以下方式配置(在Startup中):
這里注意,別選擇錯(cuò)了!然后就可以了。
六、程序的發(fā)布運(yùn)行
6.1-項(xiàng)目的發(fā)布
(1)右擊項(xiàng)目,選擇【發(fā)布】
(2)選擇【文件夾】
(3)選擇要保存的路徑,然后點(diǎn)擊【完成】;
(4)點(diǎn)擊【發(fā)布】,可以看到已經(jīng)發(fā)布完成了。
6.2-項(xiàng)目的運(yùn)行
6.2.1-IIS發(fā)布
- IIS直接簡(jiǎn)歷網(wǎng)站,目錄指向項(xiàng)目跟目錄下的Debug、Net5文件;——不行
- 把項(xiàng)目發(fā)布后,目錄指向項(xiàng)目發(fā)布目錄;——可以的
6.2.2-ASP.NET Core跨平臺(tái)原因
6.2.3-使用腳本啟動(dòng)網(wǎng)站
6.2.4-發(fā)布之后運(yùn)行為什么樣式加載不出404?
(1)需要在【startup.cs】文件的【Configure】方法中引入一個(gè)中間件。
七、命令參數(shù)讀取+配置多種讀取
7.1-配置文件讀?。?)
在【startup.cs】文件中讀取配置文件
在【控制器】中讀取配置文件。
(1)先構(gòu)造函數(shù)注入Configure
(2)寫代碼獲取
7.2-配置文件讀?。?)
(1)定義一個(gè)類,結(jié)構(gòu)(數(shù)據(jù)類型、屬性名)和配置文件中完全一致。
(2)在【Startup.sc】配置一下
(3)在控制器中,構(gòu)造函數(shù)注入一個(gè)IOptions
(4)獲得并返回值
(5)前端獲取值
八、MVC開(kāi)發(fā)
8.1-什么是MVC?
- V——View——視圖:呈現(xiàn)給用戶看到的內(nèi)容(表現(xiàn)層)
- C——Controller——控制器:控制業(yè)務(wù)邏輯計(jì)算,調(diào)用服務(wù),選擇返回什么內(nèi)容,可以返回視圖,JSON、字符串等等。
- M——Model——視圖模型:用作控制器和視圖之間傳遞數(shù)據(jù)的載體。
8.2-cshtml文件
其實(shí)是一個(gè)類文件。
Razor混編:可以在cshtml上寫 后臺(tái)C#代碼 + 前臺(tái)html代碼,混合起來(lái)寫;
(1)可以引入命名空間
(2)直接寫后臺(tái)代碼
(3)實(shí)現(xiàn)接口
(4)可以依賴注入
(5)可以添加特性Class
(6)定義方法并調(diào)用
(7)寫單行代碼、多行代碼
(8)Razor表達(dá)式
(9)輸出尖括號(hào)
(10)for循環(huán)
(11)在后臺(tái)代碼內(nèi)部寫HTML代碼
8.3-如何解決修改視圖后無(wú)需編譯后即可生效?
修改視圖,增加了html代碼,不能馬上生效,怎么辦?使用中間件
1.引入Nuget包
2.在【Startup.cs】文件的票【ConfigureServices】方法中配置。
8.4-Razor布局
8.4.1-我們看到的頁(yè)面組成到底有哪些內(nèi)容?
答:包含了Layout的模板嵌套的返回的需要渲染的視圖內(nèi)容;
8.4.2-如何嵌套呢?
答:通過(guò)Layout中RendBody()方法做了替換;把返回的視圖替換到模板也中,形成了一整塊的內(nèi)容;目的在于每一次返回不同的頁(yè)面的時(shí)候,能夠吧不變的視圖部分,種以重用;這樣就可以少些代碼。
8.4.3-在模板頁(yè)面導(dǎo)入了JQ,在視圖頁(yè)面使用JQ為什么報(bào)錯(cuò)?
注意:
- 在模板頁(yè)中使用CSS/JS的時(shí)候,為了提高效率,會(huì)把Css引入在模板的上方,將JS寫在模板的下方。頁(yè)面嵌套到模板頁(yè)后,就會(huì)出現(xiàn)在引用JS的上方調(diào)用JS,此時(shí)JS其實(shí)是調(diào)用不了的。
答:因?yàn)镾cript是寫在下面的,先加載RenderBody,后加載JQ,所以會(huì)報(bào)錯(cuò),解決方法如下:
九、Razor擴(kuò)展-HTML控件
9.1-Html擴(kuò)展控件(1)
本質(zhì):通過(guò)一個(gè)后臺(tái)方法,返回一個(gè)【已經(jīng)存在】的Html標(biāo)簽的字符串,瀏覽器在讀取的時(shí)候,就讀取成一個(gè)Html標(biāo)簽。
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.調(diào)用
<!--1.引入命名空間-->
<!--2.使用圖片--自定義 擴(kuò)展方法-->
@Html.Img("https://tpc.googlesyndication.com/simgad/3105023548593992165/downsize_200k_v1?w=200&h=200","border:1px solid red;")
9.2-Html擴(kuò)展控件(2)
通過(guò)一個(gè)后臺(tái)方法,返回一個(gè)【不存在】的Html標(biāo)簽的字符串,在讀取的時(shí)候,通過(guò)制后臺(tái)方法,去生成我們制定的標(biāo)簽。
1.寫一個(gè)擴(kuò)展方法,定義一個(gè)普通類,類名建議以TagHelper結(jié)尾,加上特性;如果沒(méi)有標(biāo)記特性,視圖中在調(diào)用的時(shí)候使用當(dāng)前類名去掉TagHelper后綴得到的的字符串來(lái)調(diào)用。繼承TagHelpre抽象類、或者實(shí)現(xiàn)接口ITagHelpr,二者選一起均可。然后實(shí)現(xiàn)接口Proccss方法。
2.在【_ViewImports.cshtml】進(jìn)行注冊(cè)
3.使用
9.3-Razor局部視圖
1.創(chuàng)建一個(gè)局部視圖
2.進(jìn)行調(diào)用
9.3.1-局部視圖的缺陷:
局部視圖沒(méi)有去訪問(wèn)控制器中的Action,所以不能完美的實(shí)現(xiàn)后臺(tái)代碼。可以使用視圖組件解決。
9.4-視圖組件-擴(kuò)展定制
9.4.1-視圖組件的優(yōu)點(diǎn)?
- 呈現(xiàn)頁(yè)面相應(yīng)的某一部分而不是整個(gè)相應(yīng)
- 包括在控制器和視圖之間發(fā)現(xiàn)的關(guān)注分離和可測(cè)試性優(yōu)勢(shì)
- 可以具有參數(shù)和業(yè)務(wù)邏輯
- 通常在頁(yè)面布局中調(diào)用
9.4.2-如何自定義視圖組件?
(1)Rzaor組件對(duì)應(yīng)的類需要以ViewComponent結(jié)尾,該類需要繼承自ViewCompnent類。
(2)定義一個(gè)異步版本的InvokeAsync,可以自定義參數(shù),IncokeAsync就是返回組件內(nèi)容的方法。
(3)在Views/Shared文件下建立Components文件夾,在這個(gè)文件下創(chuàng)建一個(gè)和組件類名相同(如果加了特性,就按照特性上面的名稱來(lái))的文件夾,然后創(chuàng)建一個(gè)Default.cshtml視圖。
注意:以上步驟可以不按照上面執(zhí)行,我們可以隨意新建一個(gè)視圖,然后指定路徑就可以了。
(4)調(diào)用
十、內(nèi)置容器基本使用
10.1-什么是IOC?
把對(duì)象的創(chuàng)建,統(tǒng)一交給第三方容器來(lái)創(chuàng)建;
10.2-如何使用IOC?
(1)在【Startup.cs】的【ConfigureServices】中注冊(cè)服務(wù);注冊(cè)抽象和具體的依賴關(guān)系;
(2)通過(guò)構(gòu)造函數(shù)進(jìn)行依賴注入,自動(dòng)得到服務(wù)的實(shí)例;
(3)調(diào)用;
10.3-如何使用IOC?(第二種方法)
(1)在【Startup.cs】的【ConfigureServices】中注冊(cè)服務(wù);注冊(cè)抽象和具體的依賴關(guān)系;
(2)通過(guò)構(gòu)造函數(shù)進(jìn)行依賴注入。
(3)調(diào)用;
10.4-在視圖中使用IOC
10.4-什么是依賴注入?
DI依賴注入:IServiceCollection支持且支持構(gòu)造函數(shù)注入。
如對(duì)象A依賴對(duì)象B,對(duì)象B依賴于對(duì)象C,就可以先構(gòu)造對(duì)象C,然后傳遞給對(duì)象B,然后傳遞給對(duì)象A,然后得到具體的實(shí)例。可以支持無(wú)限層級(jí)的依賴注入,前提是先要先注入服務(wù)(注冊(cè)抽象和具體的映射關(guān)系)。
10.5-IServiceCollection生命周期
那么在創(chuàng)建對(duì)象的時(shí)候, 不同的情況,需要讓對(duì)象單例,每一次都創(chuàng)建新的對(duì)象實(shí)例,不同的作用于創(chuàng)建新的實(shí)例。
AddTransient:順時(shí)聲明周期,每次獲取的都是不同的實(shí)例
AddSingleton:?jiǎn)卫芷冢谡麄€(gè)進(jìn)程中獲取的都是同一個(gè)實(shí)例
AddScoped:作用域生命周期(同一個(gè)作用域,獲取的是同一個(gè)對(duì)象的實(shí)例,不同的作用域,獲取的是不同的獨(dú)對(duì)象實(shí)例)
建議:開(kāi)發(fā)工作中,一般情況下,都是一個(gè)請(qǐng)求一個(gè)對(duì)象的實(shí)例,所以使用的是順時(shí)聲明周期(AddTransient)。
十一、Autofac容器
11.1-Autofac容器初識(shí)?
Autofac也是一款流行的IOC容器;
11.2-如何使用Autofac容器?
(1)管理Nuget程序包,下載并安裝【Autofac】
(2)在【Startup.cs】的【ConfigureServices】中注冊(cè)服務(wù);
11.3-Autofac注入方式-構(gòu)造函數(shù)注入
11.4-Autofac注入方式-屬性注入
11.5-Autofac注入方式-方法注入
11.6-Autofac生命周期-瞬時(shí)生命周期(默認(rèn))
瞬時(shí)生命周期:每一次獲取對(duì)象都是一個(gè)全新的實(shí)例,默認(rèn)的生命周期。
11.7-Autofac生命周期-單例生命周期
單例聲明周期:在整個(gè)進(jìn)程中,對(duì)象永遠(yuǎn)都是同一個(gè)實(shí)例(SingleInstance)
11.8-Autofac生命周期-每個(gè)生命周期范圍一個(gè)實(shí)例
每個(gè)生命周期范圍一個(gè)實(shí)例:同一個(gè)生命周期范圍內(nèi)是同一個(gè)實(shí)例,不同的生命周期范圍,實(shí)例不一樣。(InstancePerLifetimeScope)
11.9-Autofac生命周期-每個(gè)匹配生命周期范圍一個(gè)實(shí)例
語(yǔ)法:InstancePerMatchingLifetimeScope(名稱)
11.10-Autofac生命周期-每個(gè)請(qǐng)求一個(gè)實(shí)例
11.11-Autofac支持配置文件
(1)管理Nuget包,引入3個(gè)程序集;
(2)新建一個(gè)配置文件【autofac.json】,記得將配置文件設(shè)置為:始終復(fù)制到目錄。
(3)在【Startup.cs】的【ConfigureServices】中注冊(cè)服務(wù);
11.12-Autofac整合MVC
注意:Autofac是一個(gè)第三方容器;
(1)指定Autofac工廠替換默認(rèn)工廠,在【Program.cs】中的【CreateHostBuilder】方法中指定。
(2)在【Startup.cs】類中增加一個(gè)【ConfigureContainer】方法,用來(lái)注冊(cè)服務(wù)關(guān)系。
/// <summary>
/// 增加一個(gè)方法:
/// 整個(gè)方法被Autofac自動(dòng)調(diào)用
/// 負(fù)責(zé)注冊(cè)各種服務(wù)
/// </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)通過(guò)控制器構(gòu)造函數(shù)注入,獲取實(shí)例。
這種方法也還能用:
11.13-Autofac支持控制器屬性注入
(1)首先在【Startup.cs】中【ConfigureServices】方法中,指定控制器實(shí)例容器來(lái)創(chuàng)建,進(jìn)行替換。
(2)創(chuàng)建一個(gè)類(特性);
(3)創(chuàng)建一個(gè)類,用來(lái)判斷維度;
(4)在【Startup.cs】中創(chuàng)建一個(gè)【ConfigureContainer】方法,負(fù)責(zé)注冊(cè)各種服務(wù)。
11.14-Autofac一個(gè)實(shí)例多實(shí)現(xiàn)的問(wèn)題
注意:
- 如果一個(gè)抽象多個(gè)實(shí)例,都注冊(cè)了,通過(guò)構(gòu)造函數(shù)用抽象類型來(lái)獲取實(shí)例,哪個(gè)是后面注冊(cè)的,就能獲得哪個(gè),覆蓋類型的。
- 如果一個(gè)抽象多個(gè)實(shí)例,都注冊(cè)了,可以通過(guò)一個(gè)IEnumerable<抽象類>,當(dāng)做構(gòu)造函數(shù)參數(shù),可以獲取到左右注冊(cè)的具體的實(shí)例。
一般使用以下方法:
(1)在【Startup.cs】中創(chuàng)建的【ConfigureContainer】方法中,注冊(cè)資源和實(shí)現(xiàn)(單抽象、多實(shí)現(xiàn))
(2)通過(guò)構(gòu)造函數(shù)中,使用具體理性實(shí)理性做我參數(shù),可以匹配到不同的具體類型實(shí)例。
(1)新建一個(gè)類,該類繼承Module類,實(shí)現(xiàn)Load方法。
(2)與之前相同,不同的而方式:在【Startup.cs】中創(chuàng)建的【ConfigureContainer】方法中,注冊(cè)資源和實(shí)現(xiàn)(單抽象、多實(shí)現(xiàn))
11.15-Autofac通過(guò)抽象(接口)支持AOP(面向切面編程-做應(yīng)用型系統(tǒng))
AOP-面向切面編程:不用修改之前代碼的基礎(chǔ)上,可以動(dòng)態(tài)的在某個(gè)動(dòng)作之前加一些操作,動(dòng)態(tài)的在某一個(gè)動(dòng)作之后做點(diǎn)什么事。
(1)管理Gurget程序包,下載【Castle.Core】包,該包用來(lái)動(dòng)態(tài)代理。
(2)創(chuàng)建一個(gè)類為【CustomAutofacAop】,該類繼承自【IInterceptor】接口,并實(shí)現(xiàn)接口中的【Intercept】方法。
(3)在服務(wù)的抽象上面做一個(gè)標(biāo)記,這個(gè)標(biāo)記是用來(lái):支持AOP擴(kuò)展能夠生效。
(4)因?yàn)檫@個(gè)【CustomAutofacAop】實(shí)例也是通過(guò)Autofac的IOC來(lái)做的,所以需要在【Startup.cs】中創(chuàng)建的【ConfigureContainer】方法中,注冊(cè)服務(wù),讓Autofac支持AOP。
11.16-Autofac通過(guò)類支持AOP
(1)管理Gurget程序包,下載【Castle.Core】包,該包用來(lái)動(dòng)態(tài)代理。
(2)創(chuàng)建一個(gè)類為【CustomAutofacAopClass】,該類繼承自【IInterceptor】接口,并實(shí)現(xiàn)接口中的【Intercept】方法。
(3)在類上面做一個(gè)標(biāo)記,這個(gè)標(biāo)記是用來(lái):支持AOP擴(kuò)展能夠生效。
(4)因?yàn)檫@個(gè)【CustomAutofacAop】實(shí)例也是通過(guò)Autofac的IOC來(lái)做的,所以需要在【Startup.cs】中創(chuàng)建的【ConfigureContainer】方法中,注冊(cè)服務(wù),讓Autofac支持AOP。
11.17-Autofac單抽象多實(shí)現(xiàn)構(gòu)造函數(shù)注入(MVC)
(1)在【Startup.cs】中創(chuàng)建的【ConfigureContainer】方法中,注冊(cè)服務(wù)。
(2)在控制器中調(diào)用。
11.18-Autofac單抽象多實(shí)現(xiàn)屬性注入
(1)道理和上面是一樣的,可以吧Autofac上下文當(dāng)做屬性來(lái)注入。
(2)在使用的時(shí)候,通過(guò)Autofac上下文+不同注冊(cè)的標(biāo)識(shí),獲取到不同的具體實(shí)例。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-637592.html
上一章節(jié):https://www.cnblogs.com/kimiliucn/p/17613434.html
下一章節(jié):https://www.cnblogs.com/kimiliucn/p/17620159.html
原文地址:https://www.cnblogs.com/kimiliucn/p/17620153.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-637592.html
到了這里,關(guān)于.NET5從零基礎(chǔ)到精通:全面掌握.NET5開(kāi)發(fā)技能【第二章】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!