開始
在上一篇文章:dotnet core多平臺開發體驗 ,體驗了一把dotnet core 之後,現在想對之前做的例子進行改造,想看看加上mvc框架是一種什麼樣的體驗,於是我就要開始誕生今天的這篇文章來分享我的感受了。
一、專案改造加入mvc框架
首先我們先修改project.json檔案,加入mvc框架的依賴、新增發布時候的釋出的包含內容、還有就是編譯選項,修改前後的對比如下圖。
第二我們對Startup.cs進行修改,以讓能載入mvc框架進行工作。如下圖,把我們原來輸出到頁面的內容給刪除掉,修改成使用mvc並配置mvc的路由資訊。同時還需要把mvc給加入到services裡面。
第三我們要新增下 檢視和控制器,建立Controllers和Views兩個目錄。並且新增HomeController控制器和它對應的檢視。
HomeController.cs的內容
1 2 3 4 5 6 7 8 9 10 11 12 |
using Microsoft.AspNetCore.Mvc; namespace LearnDotnetCore.Controllers { public class HomeController : Controller { public IActionResult Index() { return View(); } } } |
Home/Index.cshtml的內容
1 |
Hello from ASP.NET Core MVC! |
到這裡改造加入的內容已經完成了,然後輸入命令來下載依賴包和編譯執行
dotnet restore
dotnet run
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Project LearnDotnetCore (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified Compiling LearnDotnetCore for .NETCoreApp,Version=v1.0 Compilation succeeded. 0 Warning(s) 0 Error(s) Time elapsed 00:00:04.0228759 Hosting environment: Production Content root path: /Users/caipeiyu/Documents/code/c#/LearnDotnetCore Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down. |
輸入上面兩個命令後,顯示編譯成功,並執行起來。 然後開啟瀏覽器輸入地址http://localhost:5000/ 瀏覽器顯示內容 Hello from ASP.NET Core MVC!
。到這裡我們已經成功的給新增上mvc框架,並且很好的執行起來,但是介面好像挺單調,可以新增點其他的內容讓顯示充實的。新增mvc框架進來如此的簡單,內容如此的少,文章到這裡結束肯定不是我的風格了,篇幅不夠放首頁等下不小心就被移除了,這肯定是不能忍受的啦。下面可以來研究下這個mvc的簡單執行原理然後分享一下,怎麼說也得湊點字數。
二、ASP.NET Core MVC執行原理初探
首先我們先了解一下什麼是mvc模式,什麼是mvc框架。其實像我們經常說的mvc很多講的都是這麼一個mvc框架,而不是講的什麼mvc模式。
需要明白的一點是 MVC模式(Model–view–controller)是軟體工程中的一種軟體架構模式,而aps.net mvc是一種對mvc模式實現的一個框架。
參考資料:https://zh.wikipedia.org/wiki/MVC
自己實現簡單的mvc
在一開始,假設我們沒有 asp.net mvc 框架
那麼我們自己想要實現一個mvc模式的話,那麼我們能如何去實現呢?
首先我們來新建一個web專案,如果像前面那樣用dotnet new建立一個專案然後再改造,感覺還是比較麻煩。這裡有另一種建議,使用Yeoman 來新建立專案,參考:https://docs.asp.net/en/latest/client-side/yeoman.html?#building-projects-with-yeoman
安裝細節這裡不做翻譯介紹,請自行研究。安裝完這個東西后,我們可以新建立一個Empty Web Application專案。建立完成專案後,我們可以來建立一個mvc實現程式碼。
首先我們可以建立一個 Model
1 2 3 4 |
public class MyModel { public string Name{get;set;} } |
然後建立一個 View
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using Microsoft.AspNetCore.Http; public class MyView { private MyModel _model; public MyView(MyModel model){ _model = model; } public async System.Threading.Tasks.Task Show(HttpContext context) { await context.Response.WriteAsync($"Hello {_model.Name}"); } } |
最後建立一個Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class MyController { public MyView Index(){ MyModel model = new MyModel(){ Name="I am Home!" }; return new MyView(model); } public MyView About(){ MyModel model = new MyModel(){ Name="I am About" }; return new MyView(model); } } |
建立完成後,我們就可以在入口處呼叫我們Controller,入口為Startup類的方法Configure裡面的app.Run修改程式碼如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public void Configure(IApplicationBuilder app) { MyController controller = new MyController(); app.Run(async (context) => { switch (context.Request.Path.Value) { case "/about": await controller.About().Show(context); break; default: await controller.Index().Show(context); break; } }); } |
再執行 dotnet run,啟動成功後,在瀏覽器裡面輸入http://localhost:5000/ 就顯示 Hello I am Home! 輸入 http://localhost:5000/about 就顯示 Hello I am About,如上,就是我們實現了最簡單的一個mvc。看到這裡,可能還是很多人一頭霧水那asp.net mvc裡面是怎麼一回事呀。
aspnet mvc執行初步解析
想知道aspnet mvc的模型是如何工作起來的,最簡單有效的辦法就是去看它的原始碼,參考原始碼:https://github.com/aspnet/Mvc
程式的一個順序如下:
- 先新增所有mvc執行需要依賴的東西到servicecollection裡面去。包括Controller、Views等。MvcServiceCollectionExtensions.cs
- 新增路由支援,然後根據路由實現的中介軟體來驅動控制器的動作。MvcApplicationBuilderExtensions.cs
在新增路由支援的原始碼裡面我們可以看到有一句程式碼
1 2 3 4 |
var routes = new RouteBuilder(app) { DefaultHandler = app.ApplicationServices.GetRequiredService(), }; |
從這個程式碼我們不難看到路由的驅動入口就是 MvcRouteHandler,在這個類裡面呼叫方法public Task RouteAsync(RouteContext context),這個方法主要是根據路由提供的資料來選擇是要執行哪個控制器和控制器裡面的方法。具體的實現可以參考ControllerActionInvoker.cs
整個mvc執行起來的大概原理也就是這樣,感覺好像也沒有特別的複雜。至於這個mvc框架裡面的依賴是如何注入,如何在呼叫到時取出來就不屬於本文的範圍。然後對路由內部的實現有興趣的可以參考原始碼:https://github.com/aspnet/Routing
由於每一個人對知識的掌握範圍的不同,可能單純閱讀程式碼是無法明白是什麼意思,那麼可以把原始碼下載下來,然後在我說到的這幾個方法裡面加斷點看看每一個變數是怎麼樣的,可能會更好的輔助理解。更仔細的內容我將會在今後的文章裡面進行介紹。本文結束。