开始

在上一篇文章: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

程序的一个顺序如下:

  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

由于每一个人对知识的掌握范围的不同,可能单纯阅读代码是无法明白是什么意思,那么可以把源码下载下来,然后在我说到的这几个方法里面加断点看看每一个变量是怎么样的,可能会更好的辅助理解。更仔细的内容我将会在今后的文章里面进行介绍。本文结束。


由于本人水平有限,知识有限,文章难免会有错误,欢迎大家指正。如果有什么问题也欢迎大家回复交流。要是你觉得本文还可以,那么点击一下推荐。

dotnet core开发体验之开始MVC的更多相关文章

  1. dotnet core 开发体验之Routing

    开始 回顾上一篇文章:dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的,所以感觉需要研究一下Routing是什么鬼. ...

  2. vs2017 js cordova + dotnet core 开发app

    原文:vs2017 js cordova + dotnet core 开发app 1.记得在index.html加入 <meta http-equiv="Content-Securit ...

  3. dotNet Core开发环境搭建及简要说明

    一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...

  4. 使用ubuntu做为dotnet core开发环境

    一.安装google浏览器 1.下载安装包(传送门:http://www.google.cn/intl/zh-CN/chrome/browser/desktop/index.html) 2.使用sud ...

  5. dotnet core 开发中遇到的问题

    1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...

  6. dotnet core 开发无缝兼容Http和Websocket协议的接口服务

    在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket和http这两种协议来说就有些不同,从实现上来看Websocket可以说是Http的升级子协议, 两者在协议处理上基本一致 ...

  7. 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

    0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...

  8. 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  9. dotnet core 微服务教程

    这个教程主要是对于第一次使用dotnet core开发的同学. 运行环境是在centos 7 , 使用了docker容器. 即这是一篇运行在linux的docker容器上的微服务的简单应用. 一. 安 ...

随机推荐

  1. 代码管理工具 --- git的学习笔记二《git的工作原理》

    通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...

  2. Markdown语言.md文件

    转自:http://www.kuqin.com/shuoit/20141125/343459.html 之前一直在使用github,也在上面分享了不少的项目和Demo,每次创建新项目的时候,使用的都是 ...

  3. sql语句,怎么查看一个表中的所有约束

    sql语句,怎么查看一个表中的所有约束,比如,一个student表,有唯一,外键,主键,用sql语句怎么查看student表中的所有约束呢? select * from sysobjects wher ...

  4. IE9 JSON未定义

    原文:http://social.msdn.microsoft.com/Forums/ie/en-US/fc41127c-0243-4d2e-8e7c-2b311f12e390/ie9-json-no ...

  5. Dotfuscator自定义规则中的元素选择

    Dotfuscator是专业的.NET程序代码保护软件.是支持规则自定义的,你可以对重命名.程序控制流.字符串加密等等功能自定义规则.在进行规则自定义过程中,可以通过元素的不同选择,满足自己的程序需要 ...

  6. ios_swift开发资源整理

    目录 1.苹果官方资源 2.国内外视频网站推荐 3.中文文档 4.demo网站 5.开发工具推荐 6.国内外开发网站论坛 7.技术博客推荐 8.书籍推荐 9.第三方框架推荐 10.第三方发布平台 11 ...

  7. mybatis choose标签的使用

    MyBatis 提供了 choose 元素.if标签是与(and)的关系,而 choose 是或(or)的关系. choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立 ...

  8. Windows Server2012R2 添加Microsoft .NET Framework 3.5 功能失败的解决方法

    最近部署了一台Windows Server2012R2的虚机,在安装sharepoint foundation 2013之前安装必备的组件的时候安装到一半报错了没有安装成功,后来发现原来是系统的.NE ...

  9. [Bayes] Hist &amp; line: Reject Sampling and Importance Sampling

    吻合度蛮高,但不光滑. > L= > K=/ > x=runif(L) > *x*(-x)^/K)) > hist(x[ind],probability=T, + xla ...

  10. JFinal Web开发学习(五)注册界面和后端验证

    效果: 直接点击注册后 : 后端验证是可靠地,前端js验证是不可靠的.只需要在浏览器删除js验证代码即可突破js验证. 1.注册界面 在WebRoot下新建regist.jsp <%@ page ...