国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - .NET Core源碼解析配置文件及依賴注入

.NET Core源碼解析配置文件及依賴注入

2020-06-11 17:17依樂祝 ASP.NET教程

這篇文章我們設計了一些復雜的概念,因為要對ASP.NET Core的啟動及運行原理、配置文件的加載過程進行分析,依賴注入,控制反轉等概念的講解等

寫在前面

上篇文章我給大家講解了ASP.NET Core的概念及為什么使用它,接著帶著你一步一步的配置了.NET Core的開發環境并創建了一個ASP.NET Core的mvc項目,同時又通過一個實戰教你如何在頁面顯示一個Content的列表。不知道你有沒有跟著敲下代碼,千萬不要做眼高手低的人哦。

這篇文章我們就會設計一些復雜的概念了,因為要對ASP.NET Core的啟動及運行原理、配置文件的加載過程進行分析,依賴注入,控制反轉等概念的講解等。

俗話說,授人以魚不如授人以漁,所以文章旨在帶著大家分析源碼,讓大家能知其然更能知其所以然。為了偷懶,繼續使用上篇文章的例子了!

ASP.NET Core啟動源碼解析

這部分我就帶著大家一起看下asp.net core項目的運行流程吧!順帶著了解下asp.net core的運行原理,說的不好的話,希望大家給以指正,從而能夠正確的幫助更多的人。

1.首先上一下上篇文章的項目結構吧,如下所示,熟悉C#的朋友應該知道,要找程序的入庫,那么就應該找到Main方法。而asp.net core的main方法就在Program.cs文件中。

.NET Core源碼解析配置文件及依賴注入

2.打開后看到如下的代碼,我加了注釋,大伙將就看下,下面我們來一步一步的分析

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <summary>
 /// Main方法,程序的入口方法
 /// </summary>
 /// <param name="args"></param>
 public static void Main(string[] args)
 {
  CreateWebHostBuilder(args)//調用下面的方法,返回一個IWebHostBuilder對象
  .Build()//用上面返回的IWebHostBuilder對象創建一個IWebHost
  .Run();//運行上面創建的IWebHost對象從而運行我們的Web應用程序換句話說就是啟動一個一直運行監聽http請求的任務
 }
 
 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  WebHost.CreateDefaultBuilder(args)//使用默認的配置信息來初始化一個新的IWebHostBuilder實例
  .UseStartup<Startup>();// 為Web Host指定了Startup類

3.可以看到asp.net core程序實際上就是一個控制臺程序,運行一個webhost對象從而啟動一個一直運行的監聽http請求的任務。所以我們的重點就是分析一下這個WebHost創建的過程:

創建IWebHostBuilder-》創建IWebHost-》然后運行創建的IWebHost。

4.這里我們從IWebHostBuilder的Build分析下創建的過程,有興趣的朋友可以看下,沒興趣的朋友可以直接跳到下一個步驟繼續閱讀。

                1.首先到aspnetcore的github開源地址https://github.com/aspnet/AspNetCore/tree/release/2.1 上去下載源碼(我們使用的是2.1)。然后使用vscode打開解壓后的文件夾。至于vscode如何加載文件,你可以看我這篇文章使用Visual Studio Code開發.NET Core看這篇就夠了 。

                2.根據IWebHostBuilder的命名空間我們找到了它的實現,路徑為src/Hosting/Hosting/src/WebHostBuilder.cs

.NET Core源碼解析配置文件及依賴注入

                3.通過上面的代碼我們可以看到首先是通過BuildCommonServices來構建一個ServiceCollection。為什么說這么說呢,先讓我們我們跳轉到BuidCommonServices方法中看下吧。

.NET Core源碼解析配置文件及依賴注入

可以看到,var services = new ServiceCollection();首先new一個ServiceCollection然后往services里面注入很多內容,比如:WebHostOptions ,IHostingEnvironment ,IHttpContextFactory ,IMiddlewareFactory 等等(其實這里已經設計到依賴注入的概念了,先思考下吧),然后我們在后續就可以使用了!最后這個BuildCommonServices就返回了這個services對象。

                4.在上面的依賴注入中有一個方法,不知道大家注意到沒有,因為我們在步驟2貼出的代碼里面有一個UseStartup<Startup>() 其實在上面的BuildCommonServices方法中也有對IStartup的注入的。首先,判斷Startup類是否繼承于IStartup接口,如果是繼承的,那么就可以直接加入在services 里面去,如果不是繼承的話,就需要通過ConventionBasedStartup(methods)把method轉換成IStartUp后注入到services里面去。結合上面我們的代碼,貌似我們平時用的時候注入的方式都是采用后者。

                5.我們再回到build方法拿到了BuildCommonServices方法構建的ServiceCollection實例后,通過GetProviderFromFactory(hostingServices) 方法構造出了IServiceProvider 對象。到目前為止,IServiceCollection和IServiceProvider都拿到了。然后根據IServiceCollection和IServiceProvider對象構建WebHost對象。構造了WebHost實例還不能直接返回,還需要通過Initialize對WebHost實例進行初始化操作。那我們看看在初始化函數Initialize中,都做了什么事情吧。

.NET Core源碼解析配置文件及依賴注入

                6.這里我們把代碼導航到src/Hosting/Hosting/src/Internal/WebHost.cs找到Initialize方法。如下圖所示:主要就是一個EnsureApplicationServices 方法。

.NET Core源碼解析配置文件及依賴注入

                7.我們繼續導航查看這個方法的內容如下:就是拿到Startup 對象,然后把_applicationServiceCollection 中的對象注入進去。

.NET Core源碼解析配置文件及依賴注入

                8.至此我們build中注冊的對象以及StartUp中注冊的對象都已經加入到依賴注入容器中了,接下來就是Run起來了。這個run的代碼在src\Hosting\Hosting\src\WebHostExtensions.cs中,代碼如下:

.NET Core源碼解析配置文件及依賴注入

WebHost執行RunAsync運行web應用程序并返回一個只有在觸發或關閉令牌時才完成的任務(這里又涉及到異步編程的知識了,咱們以后再詳細講解) 。這就是我們運行ASP.Net Core程序的時候,看到的那個命令行窗口了,如果不關閉窗口或者按Ctrl+C的話是無法結束的。

                9.至此啟動的過程的源碼分析完成了。

配置文件

上面給大家介紹了ASP.NET Core的啟動過程,中間牽扯到了一些依賴注入的概念。關于依賴注入的概念呢,我們后面再說,這里先給大家講解下配置文件的加載過程。

4.打開上篇文章我們創建的項目,并在appsettings.json里面加入如下內容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
 "Logging": {
 "LogLevel": {
 "Default": "Warning"
 }
 },
 "Content": {
 "Id": 1,
 "title": "title1",
 "content": "content1",
 "status": 1,
 "add_time": "2018-11-21 16:29",
 "modify_time": null
 },
 "AllowedHosts": "*"
}

5.然后在Startup類中ConfigureServices中注冊TOptions對象如下所示:

services.Configure<Content>(Configuration.GetSection("Content"));//注冊TOption實例對象

這段代碼也就是從appsettings.json這個配置文件中的Content這個節點匹配到Content這個對象上。

6.修改下ContentController這個控制器代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private readonly Content contents;
 public ContentController(IOptions<Content> option)
 {
  contents = option.Value;
 }
 /// <summary>
 /// 首頁顯示
 /// </summary>
 /// <returns></returns>
 public IActionResult Index()
 {
 
  return View(new ContentViewModel { Contents=new List<Content> { contents} });
 }

7.按下F5運行下,然后導航到Content目錄看到如下頁面:說明成功從appsettings.json這個文件中加載了內容。這一切是怎么發生的呢?下面我們就一步一步的來分析。

.NET Core源碼解析配置文件及依賴注入

8.我們回過頭來看我們的Main方法,發現里面有一個CreateDefaultBuilder方法,就是這個方法里面為我們做了一些默認的設置,然后加載我們的配置文件的!

.NET Core源碼解析配置文件及依賴注入

9.我們在源碼里面找到CreateDefaultBuilder 的源碼(反正我找了半天,起初在Hosting下面找,實際上在MetaPackages下面的),位置在src\MetaPackages\src\Microsoft.AspNetCore\WebHost.cs 有的人可能找不到哦,可以看到這個方法會在ConfigureAppConfiguration 的時候默認加載appsetting文件,并做一些初始的設置,所以我們不需要任何操作,就能加載appsettings 的內容了。

.NET Core源碼解析配置文件及依賴注入

10.既然知道了原理后,我們就試著重寫下這個ConfigureAppConfiguration 然后加載我們自定義的json文件吧。

11.鼠標右鍵新建一個Content.json文件,然后輸入如下的內容:

?
1
2
3
4
5
6
7
8
9
10
11
12
{
 "ContentList":
 {
 "Id": 1,
 "title": "title1 from diy json",
 "content": "content1 from diy json",
 "status": 1,
 "add_time": "2018-11-21 16:29",
 "modify_time": null
 }
 
}

12.然后打開Program.cs。按如下代碼進行改造:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <summary>
 /// Main方法,程序的入口方法
 /// </summary>
 /// <param name="args"></param>
 public static void Main(string[] args)
 {
  CreateWebHostBuilder(args)//調用下面的方法,返回一個WebHostBuilder對象
  .Build()//用上面返回的WebHostBuilder對象創建一個WebHost
  .Run();//運行上面創建的WebHost對象從而運行我們的Web應用程序換句話說就是啟動一個一直運行監聽http請求的任務
 }
 
 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  WebHost.CreateDefaultBuilder(args)//使用默認的配置信息來初始化一個新的IWebHostBuilder實例
  .ConfigureAppConfiguration((hostingContext, config) =>
  {
  var env = hostingContext.HostingEnvironment;
 
  config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
   .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
   .AddJsonFile("Content.json",optional:false,reloadOnChange:false)
   .AddEnvironmentVariables();
 
  })
  .UseStartup<Startup>();// 為Web Host指定了Startup類

.NET Core源碼解析配置文件及依賴注入

13.然后Startup里面ConfigureServices中的代碼修改如下:

.NET Core源碼解析配置文件及依賴注入

14.然后按下F5運行下代碼吧,如下圖所示,從我們最新添加的json文件中加載出來數據了。

.NET Core源碼解析配置文件及依賴注入

15.這里多講一點,傳統asp.net的web.config文件如果有更改的話是必須要重啟站點才能使,配置文件生效的,但是asp.net core的配置文件是支持熱更新的,及不重啟網站也能加載更新,只需要設置一下屬性即可,如下圖所示:

.NET Core源碼解析配置文件及依賴注入

16.配置文件的源碼解讀這塊就到這里了。下面開始依賴注入的講解。

依賴注入與控制反轉

如果大家仔細閱讀文章的話,相信已經看出來了,我上面提到過好幾次依賴注入的概念。那么究竟什么是依賴注入呢?下面我們就拿我們上面的ContentController來好好的來理解下。

依賴注入:當一個對象ContentController需要另一個對象Content來協同完成任務的時候,那么這個ContentController就對這個Content對象產生了依賴關系。那么在這個ContentController中,是怎么注入的呢?就是從控制器中注入的了,如下圖所示:

.NET Core源碼解析配置文件及依賴注入

從asp.net 轉過來的你是不是想起了之前的千篇一律的new對象啊。沒對象自己new(要是女朋友也能new多好啊……)當然除了單例對象,靜態哈。

這里又設計一個概念就是控制反轉。

那么什么是控制反轉呢?你上面看到沒有,你自己new對象就是正轉,因為你自己創建自己所要使用的對象,。那么這種不需要你自己new對象,而是直接傳進來就是控制反轉了。(不知道比喻的恰不恰當哈)

依賴注入與控制反轉你是否已經了解了呢,喜歡思考的朋友可能會問了,那這個構造函數里面的IOptions<Content> option 又是怎么出來的?這里就要引入一個容器的概念了。

什么是容器呢?

這里創建IOptions<Content> option 這個對象的東西就是容器。還記得上面我們分析源碼的時候,IServiceCollection 里面注入了很多東西嗎?其實就是往IServiceCollection 這個容器里面注入方法,這樣其他地方使用的時候就能自動注入了。

這就是容器的好處,由容器來統一管理實例的創建和銷毀,你只需要關心怎么用就行了,不需要關系怎么創建跟銷毀。

當然容器創建的實例都是有生命周期的,。下面羅列一下,就不過多的講解了。

  • Transient: 每一次訪問都會創建一個新的實例
  • Scoped: 在同一個Scope內只初始化一個實例 ,可以理解為( 每一個request級別只創建一個實例,同一個http request會在一個 scope內)
  • Singleton :整個應用程序生命周期以內只創建一個實例

使用的方式也很簡單,我會在接下來的課程中詳細的通過實例來進行講解!因為現在的例子還沒發演示。

總結

本文一步一步帶著你先分析了ASP.NET Core的啟動過程及運行的原理,緊接著給你講了配置文件的加載過程及原理,并通過示例代碼演示了如何加載自定義的配置文件,最后引出了依賴注入以及控制反轉的概念,并通過對我們上面例子的分析來緊身對依賴注入以及控制反轉的理解。至此讓你知其然更知其所以然。對ASP.NET Core的原理相信你已經了然于胸了!那么接下來讓我們再準備下dapper,vue以及git的快速入門就開始我們的asp.net core cms的實戰課程吧!還是那句話基礎很重要,基礎打好,后面才能事半功倍。謝謝大家。

原文鏈接:https://www.cnblogs.com/yilezhu/p/9998021.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 综合精品 | 日韩色综合 | 色婷婷综合久久久中字幕精品久久 | 亚洲专区国产精品 | 一级黄色大片在线观看 | 久综合网| 99精品视频在线观看 | 国产精品美女久久久久久久久久久 | 欧美精品在线视频 | 欧美日韩视频在线 | 日韩三级电影免费观看 | 人人干天天干 | 久久久久久99 | 日本一区二区三区在线视频 | 自拍第一页 | 在线影院av| 四季久久免费一区二区三区四区 | 97成人在线| 97在线观看视频 | 男人天堂视频网 | 成人av小说 | 欧美女人性| 亚洲国产精品一二三区 | 一区二区三区高清 | 中文字幕av网站 | 黄色三及毛片 | 日本一级淫片免费看 | 欧美激情精品久久久久久 | 99久久综合精品五月天 | 免费看国产片在线观看 | 午夜影院免费观看视频 | 羞羞影院 | 北条麻妃在线一区二区三区 | 久久精品免费观看 | 中国一级黄色毛片视频 | 91色乱码一区二区三区 | 蜜臀网| 亚洲国产美女视频 | 亚洲区视频 | 一区二区三区不卡视频 | 精品黄色在线观看 |