上節中,我們初步的介紹了一下NetCore的一些基礎知識,為了控制篇幅(其實也是因為偷懶),我將NetCore 基礎分為兩部分來寫。
0.WebAPI 項目的建立
1..NetCore 項目執行(加載)過程
2.中間件的執行過程
3.WebAPI 的路由
4.依賴注入
5.異步編程
上一節中,我把0,1,2 這三部分說完了。
這一節中我們繼續來講剩下的部分。
3.WebAPI 的路由
路由有兩種方式: Convention-based (按約定), attribute-based(基於路由屬性配置的).
其中convention-based (基於約定的) 主要用於MVC (返回View或者Razor Page那種的).
Web api 推薦使用attribute-based.
--以上內容引用自老張的博客
我們現在的框架是基於WebApi 的,所以就着重說一下attribute-based.

這種基於屬性配置的路由可以配置Controller或者Action級別, uri會根據Http method然后被匹配到一個controller里具體的action上.
4.依賴注入
DI在.NET Core里面被提到了一個非常重要的位置。但到底依賴注入是什么? 為什么要用它? 控制反轉IOC(Iversion of Control),DI等概念到底該怎么理解?
下面的內容引用自:https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html
首先是依賴,

其次是注入:

接下來是反轉:

最后是容器:

我們接下來看看在控制台中對.NET Core DI的應用。在.NET Core中DI的核心分為兩個組件:IServiceCollection和 IServiceProvider。
通過默認的 ServiceCollection(在Microsoft.Extensions.DependencyInjection命名空間下)有三個方法:
var serviceCollection = new ServiceCollection()
.AddTransient<ILoginService, EFLoginService>()
.AddSingleton<ILoginService, EFLoginService>()
.AddScoped<ILoginService, EFLoginService>();
這三個方法都是將我們的實例注冊進去,只不過實例的生命周期不一樣。
- Transient: 每一次GetService都會創建一個新的實例
- Scoped: 在同一個Scope內只初始化一個實例 ,可以理解為( 每一個request級別只創建一個實例,同一個http request會在一個 scope內)
- Singleton :整個應用程序生命周期以內只創建一個實例
如果在Mvc中用過Autofac的InstancePerRequest的同學就知道,有一些對象在一個請求跨越多個Action或者多個Service、Repository的時候,比如最常用的DBContext它可以是一個實例。即能減少實例初始化的消耗,還能實現跨Service事務的功能。(注:在ASP.NET Core中所有用到EF的Service 都需要注冊成Scoped )
而實現這種功能的方法就是在整個reqeust請求的生命周期以內共用了一個Scope。
具體的應用,我會在框架搭建的時候,為大家舉例說明。
5.異步編程
在這里我想着重介紹一下 async 和 await 關鍵字
一下內容引用自微軟官網:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/index


按照上面例子中的,當多個任務並行的時候,我們一般采用異步的方式來進行,但是如果個別任務是需要一定的先決條件的時候,我們就可以采用await 關鍵詞來進行修飾,
await 關鍵字提供了一種非阻塞方式來啟動任務,然后在此任務完成時繼續執行。
在煎雞蛋或培根時,此代碼不會阻塞。 不過,此代碼也不會啟動任何其他任務。 你還是會將面包放進烤面包機里,然后盯着烤面包機直到面包彈出。 但至少,你會回應任何想引起你注意的人。 在接受了多份訂單的一家餐館里,廚師可能會在做第一份早餐的同時開始制作另一份早餐。
--以上,.netCore 的基礎知識部分,就介紹 的差不多了。(雖然大部分內容都是在別的地方引用過來的。也算是給大家做一個整理吧)
接下來的,終於又可以繼續搭建的我們的技術框架了!有了DI,有了await ,async.看看我們的框架可以引入哪些新的內容吧?