dotnet core开发体验之开始MVC

开始

在上一篇文章: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.0Compilation succeeded.    0 Warning(s)    0 Error(s)Time elapsed 00:00:04.0228759Hosting environment: Production
Content root path: /Users/caipeiyu/Documents/code/c#/LearnDotnetCore
Now listening on: http://localhost:5000Application 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

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

相关文章:


原文地址:http://www.cnblogs.com/caipeiyu/p/5575158.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java时间处理第三方包:Joda-Time

转载自 Java时间处理第三方包&#xff1a;Joda-TimeJoda-Time provides a quality replacement for the Java date and time classes.Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (…

Visual Studio Code五月版本更新

开源项目、跨平台代码编辑器Visual Studio Code刚发布了其1.2版本&#xff08;虽然说是2016年5月发布&#xff0c;但其实是在6月交付的&#xff09;。和往常一样&#xff0c;这次发布的版本中对于很大一部分功能都进行了改善&#xff0c;其中最值得关注的可能是一种全新整合的终…

关于SimpleDateFormat时间格式化线程安全问题

转载自 关于SimpleDateFormat时间格式化线程安全问题昨天推送的文章《关于创建和销毁对象》一文中&#xff0c;2.1重复利用对象这一小节所举的SimpleDateFormat格式化时间的例子是不合适的&#xff0c;因为多线程场景下&#xff0c;SimpleDateFormat存在线程安全问题。在此&am…

聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer

跨平台是ASP.NET Core一个显著的特性&#xff0c;而KestrelServer是目前微软推出了唯一一个能够真正跨平台的Server。KestrelServer利用一个名为KestrelEngine的网络引擎实现对请求的监听、接收和响应。KetrelServer之所以具有跨平台的特质&#xff0c;源于KestrelEngine是在一…

pdfbox java.lang.outofmemoryerror_Apache PDFBox 1.8.11 发布,Java 的 PDF 处理类

Apache PDFBox 1.8.11 发布&#xff0c;此版本是个增量 bug 修复版本&#xff0c;包括大量 bug 修复和改进。现已提供下载&#xff1a;主要改进内容&#xff1a;Bug 修复[PDFBOX-962] - All sort of Problems when importing Xfdf files into PDFs ->damaged pdfs and NPEs[…

Java8 Striped64 和 LongAdder

转载自 Java8 Striped64 和 LongAdder 数据 STRIPING 根据维基百科的这段说明&#xff1a;In computer data storage, data striping is the technique of segmenting logically sequential data, such as a file, so that consecutive segments are stored on different phys…

Roslyn项目系统简介

发布15年后&#xff0c;Microsoft终于开始替换Visual Studio中基于COM的C#和Visual Basic项目系统。Microsoft谈及很多有必要放弃目前所用系统的原因&#xff1a; 原生且基于COM单线程并与UI线程绑定难以通过和&#xff08;不同用途的&#xff09;子类型类扩展到聚合之外与Visu…

fastdfs 集群 java_FastDFS集群部署(转载 写的比较好)

之前介绍过关于FastDFS单机部署&#xff0c;详见博文&#xff1a;FastDFSNginx(单点部署)事例下面来玩下FastDFS集群部署&#xff0c;实现高可用(HA)服务器规划&#xff1a;跟踪服务器1【主机】(Tracker Server)&#xff1a;192.100.139.121跟踪服务器2【备机】(Tracker Server…

简析.NET Core 以及与 .NET Framework的关系

至2002微软公司推出.NET平台已近15年&#xff0c;在互联网快速迭代的浪潮中&#xff0c;许多语言已被淘汰&#xff0c;同时也有更多新的语言涌现&#xff0c;但 .Net 依然坚挺的站在系统开发平台的一线阵营中&#xff0c;并且随着.NET Core 即将到来(2016年6月27日)的正式版&am…

Jdk1.8 JUC源码增量解析(2)-atomic-LongAdder和LongAccumulator

转载自 Jdk1.8 JUC源码增量解析(2)-atomic-LongAdder和LongAccumulator功能简介&#xff1a;LongAdder是jdk1.8提供的累加器&#xff0c;基于Striped64实现。它常用于状态采集、统计等场景。AtomicLong也可以用于这种场景&#xff0c;但在线程竞争激烈的情况下&#xff0c;Long…

mysql 密码hash算法_如何用hash创建一个mySQL用户(‘sha256’,$salt.$password)?

我肯定错过了什么.我想为select-only事务设置数据库用户帐户,但mysql不允许我在创建用户帐户时选择密码的哈希方法.这失败了&#xff1a;GRANT SELECT ON myDB.* TO selectuserlocalhostIDENTIFIED BY hash(sha256, salted-myfakelongrandompasswordstring);错误1064(42000)&am…

为什么微软逐步转变为开源公司

微软目前拥有自己的 BSD Unix 操作系统&#xff0c;支持 Ubuntu 作为 Windows 10 的一个子系统&#xff0c;最近又将 Xamarin 软件开发工具包开源&#xff0c;所有这些意味着微软已不再是比尔盖茨和史蒂夫鲍尔默的微软了。 我知道这很难令人相信&#xff0c;但微软确实正大步走…

Jdk1.8 JUC源码增量解析(1)-atomic-Striped64

转载自 Jdk1.8 JUC源码增量解析(1)-atomic-Striped64功能简介&#xff1a;Striped64是jdk1.8提供的用于支持如Long累加器&#xff0c;Double累加器这样机制的基础类。Striped64的设计核心思路就是通过内部的分散计算来避免竞争(比如多线程CAS操作时的竞争)。Striped64内部包含…

java内部类选择题_java内部类详解(附相关面试题)

说起内部类这个词&#xff0c;想必很多人都不陌生&#xff0c;但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多&#xff0c;用得最多的是在有事件监听的情况下&#xff0c;并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟。一.内部类基础在Java中&am…

开源,新的平台之战

近日&#xff0c;OpenDaylight项目的执行总监Neela Jacques在文章《开源的转变&#xff1a;一种新的平台战争》 中提到&#xff1a;开源已经成为软件公司业务战略的关键&#xff0c;是一种新的平台之战。 多年来&#xff0c;开源软件似乎处于技术产业的边缘。而如今&#xff0c…

java下载图片到手机相册_Unity保存图片到Android手机且更新相册

Android 保存图片到设备前言:在许多的应用或游戏中,大多都有保存图片或者截图等等的功能,这篇文档我们的目的是通过 Unity 保存图片,并且调用 Andorid 中的更新相册的原生方法.流程步骤:编写更新相册的 Android 原生接口 -> Unity 编写保存图片逻辑以及调用更新相册 Android…

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

转载自 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例 wait, notify 和 notifyAll&#xff0c;这些在多线程中被经常用到的保留关键字&#xff0c;在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中…

.NET Core 使用Dapper 操作MySQL

.NET Core 使用Dapper 操作MySQL 数据库&#xff0c; .NET Core 使用Dapper。 目前官方没有出.NET Core MySQL 驱动&#xff0c;但是已经有第三方进行改动封装出.NET Core MySQL Connector 预览版。 Dapper 也已经出了 .NET Core 预览版。 Dapper dot net 是一个轻量型的ORM&a…

Angular 2与TypeScript概览

迄今为止&#xff0c;在创建Web应用方面&#xff0c;AngularJS是当前最为流行的JavaScript框架。如今&#xff0c;Angular 2和TypeScript通过一种非常类似于Java 8的语法&#xff0c;使真正面向对象的Web开发成为了主流。 据Google的工程主管Brad Green介绍&#xff0c;有130万…

正确使用 Volatile 变量

转载自 Java 理论与实践 - 正确使用 Volatile 变量 - volatile 变量使用指南Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”&#xff1b;与 synchronized 块相比&#xff0c;volatile 变量所需的编码较少&#xff0c;并且运行时开销也较少&#xf…