dotnet core開發體驗之開始MVC

開始

在上一篇文章:dotnet core多平臺開發體驗 ,體驗了一把dotnet core 以後,如今想對以前作的例子進行改造,想看看加上mvc框架是一種什麼樣的體驗,因而我就要開始誕生今天的這篇文章來分享個人感覺了。html

1、項目改造加入mvc框架

首先咱們先修改project.json文件,加入mvc框架的依賴、添加發布時候的發佈的包含內容、還有就是編譯選項,修改先後的對好比下圖。git

第二咱們對Startup.cs進行修改,以讓能加載mvc框架進行工做。以下圖,把咱們原來輸出到頁面的內容給刪除掉,修改爲使用mvc並配置mvc的路由信息。同時還須要把mvc給加入到services裏面。github

第三咱們要添加下 視圖和控制器,建立Controllers和Views兩個目錄。而且添加HomeController控制器和它對應的視圖。web

HomeController.cs的內容json

using Microsoft.AspNetCore.Mvc;

namespace LearnDotnetCore.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

Home/Index.cshtml的內容c#

Hello from ASP.NET Core MVC!

到這裏改造加入的內容已經完成了,而後輸入命令來下載依賴包和編譯運行瀏覽器

dotnet restore架構

dotnet runmvc

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的簡單運行原理而後分享一下,怎麼說也得湊點字數。app

2、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

程序的一個順序以下:

  1. 先添加全部mvc運行須要依賴的東西到servicecollection裏面去。包括Controller、Views等。MvcServiceCollectionExtensions.cs
  2. 添加路由支持,而後根據路由實現的中間件來驅動控制器的動做。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

因爲每個人對知識的掌握範圍的不一樣,可能單純閱讀代碼是沒法明白是什麼意思,那麼能夠把源碼下載下來,而後在我說到的這幾個方法裏面加斷點看看每個變量是怎麼樣的,可能會更好的輔助理解。更仔細的內容我將會在從此的文章裏面進行介紹。本文結束。


因爲本人水平有限,知識有限,文章不免會有錯誤,歡迎你們指正。若是有什麼問題也歡迎你們回覆交流。要是你以爲本文還能夠,那麼點擊一下推薦。

相關文章
相關標籤/搜索