開始
在上一篇文章:dotnet core多平台開發體驗 ,體驗了一把dotnet core 之后,現在想對之前做的例子進行改造,想看看加上mvc框架是一種什么樣的體驗,於是我就要開始誕生今天的這篇文章來分享我的感受了。
一、項目改造加入mvc框架
首先我們先修改project.json文件,加入mvc框架的依賴、添加發布時候的發布的包含內容、還有就是編譯選項,修改前后的對比如下圖。
第二我們對Startup.cs進行修改,以讓能加載mvc框架進行工作。如下圖,把我們原來輸出到頁面的內容給刪除掉,修改成使用mvc並配置mvc的路由信息。同時還需要把mvc給加入到services里面。
第三我們要添加下 視圖和控制器,創建Controllers和Views兩個目錄。並且添加HomeController控制器和它對應的視圖。
HomeController.cs的內容
using Microsoft.AspNetCore.Mvc;
namespace LearnDotnetCore.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
}
Home/Index.cshtml的內容
Hello from ASP.NET Core MVC!
到這里改造加入的內容已經完成了,然后輸入命令來下載依賴包和編譯運行
dotnet restore
dotnet run
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
public class MyModel
{
public string Name{get;set;}
}
然后建立一個 View
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
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修改代碼如下
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
在添加路由支持的源碼里面我們可以看到有一句代碼
var routes = new RouteBuilder(app)
{
DefaultHandler = app.ApplicationServices.GetRequiredService<MvcRouteHandler>(),
};
從這個代碼我們不難看到路由的驅動入口就是 MvcRouteHandler,在這個類里面調用方法public Task RouteAsync(RouteContext context),這個方法主要是根據路由提供的數據來選擇是要執行哪個控制器和控制器里面的方法。具體的實現可以參考ControllerActionInvoker.cs
整個mvc運行起來的大概原理也就是這樣,感覺好像也沒有特別的復雜。至於這個mvc框架里面的依賴是如何注入,如何在調用到時取出來就不屬於本文的范圍。然后對路由內部的實現有興趣的可以參考源碼:https://github.com/aspnet/Routing
由於每一個人對知識的掌握范圍的不同,可能單純閱讀代碼是無法明白是什么意思,那么可以把源碼下載下來,然后在我說到的這幾個方法里面加斷點看看每一個變量是怎么樣的,可能會更好的輔助理解。更仔細的內容我將會在今后的文章里面進行介紹。本文結束。
由於本人水平有限,知識有限,文章難免會有錯誤,歡迎大家指正。如果有什么問題也歡迎大家回復交流。要是你覺得本文還可以,那么點擊一下推薦。