《200 行代码, 7 个对象 -- 让你了解 ASP.NET Core 框架的本质》让很多读者对 ASP.NET Core 管道有深刻的理解, 知道了 ASP.NET Core 框架针对每个请求的处理流程. 在过去很长一段时间中, 有很多人私信给我: 能否按照相同的方式分析一下 MVC 框架. 真实的 MVC 框架其实很复杂, 所以我们依然按照类似的方式大刀阔斧地 "砍掉" 了很多 "细枝末节", 利用一个 Mini 版本的模拟框架将真实 ASP.NET Core MVC 最核心的部分展示出来. 和 Mini 版本的 ASP.NET Core 框架一样, 这个 Mini 版的 ASP.NET Core MVC 框架同样采用真实框架一致的设计, 并且是同样可以直接运行的. 为了更好的维护, 我将这两个模拟框架放到了 https://github.com/ 上.
- ASP.NET Core Mini: https://github.com/jiangjinnan/AspNetCoreMini
- ASP.NET Core MVC Mini: https://github.com/jiangjinnan/AspNetCoreMvcMini
[上篇]路由整合
整个 MVC 框架建立在路由中间件 (《ASP.NET Core 3 框架揭秘》下册具有对路由中间件的专门介绍, 本书正在参加京东满 100-50 活动, 错过之前 5 折优惠的同学可以上车了) 上. 不论是面向 Controller 的 Model-View-Controller 编程模型, 还是面向页面的 Razor Pages 编程模型, 每个请求指向的都一个某个 Action, 所以 MVC 框架只需要将每个 Action 封装成一个路由终结点(RouteEndpoint), 并通过自定义的 EndpointDataSource 注册到路由中间件上即可. 本篇着重关注 MVC 框架与路由中间件的整合, 所以我们将 Action 方法的定义作了最大的简化: Action 方法都是无参方法, 这样我们就不需要考虑参数绑定的问题; Action 方法的返回值都是 Task 或者 Void, 所有的请求处理任务都实现在方法中. 阅读全文...
- public class FoobarController: Controller
- {
- public void Foo();
- public Task BarAsync();
- public ValueTask BazAsync();
- }
[中篇]请求响应
我们在《[上篇]: 路由整合》将定义在 Controller 类型中的 Action 方法简化成只返回 Task 或者 Void 的方法, 并让方法自身去完成包括对请求予以相应的所有请求处理任务, 但真实的 MVC 框架对 Action 方法对返回类型没有任何的限制. 一般来说, 我们倾向于将 Action 方法的返回类型定义成 IActionResult,Task<IActionResult > 或者 ValueTask<IActionResult>. 如果 Action 方法返回其他类型的对象, 该对象最终还是会被转换成 IActionResult 对象. 在整个 MVC 框架针对请求的处理流程中, IActionResult 对象主要负责针对请求的响应工作. 本篇我们将对上面建立的模拟框架作进一步完善, 接触针对 Action 方法返回类型的限制. 阅读全文...
- public class FoobarController: Controller
- {
- public IActionResult Foo();
- public Task<IActionResult> BarAsync();
- public ValueTask<IActionResult> BazAsync();
- public Foobar Qux();
- public Task<Foobar> QuuxAsync();
- public ValueTask<Foobar> CorgeAsync();
- }
[下篇]参数绑定
模拟框架到目前为止都假定 Action 方法是没有参数的, 我们知道 MVC 框架对 Action 方法的参数并没有作限制, 它可以包含任意数量和类型的参数. 一旦将 "零参数" 的假设去除, Action 方法的执行就变得没那么简单了, 因为在执行目标方法之前需要绑定所有的参数. MVC 框架采用一种叫做 "模型绑定(Model Binding)" 的机制来绑定目标 Action 方法的输出参数, 这可以算是 MVC 框架针对请求执行流程中最为复杂的一个环节. 本篇文章对现有框架做进步完全, 通过实现模型绑定接触上面针对 Action 方法参数的限制. 阅读全文...
- public class FoobarController: Controller
- {
- public IActionResult Foo(Foo foo, Bar baz);
- public Task<IActionResult> BarAsync(Foo foo, Bar baz);
- public ValueTask<IActionResult> BazAsync(Foo foo, Bar baz);
- public Foobar Qux(Foo foo, Bar baz);
- public Task<Foobar> QuuxAsync(Foo foo, Bar baz);
- public ValueTask<Foobar> CorgeAsync(Foo foo, Bar baz);
- }
来源: https://www.cnblogs.com/artech/p/asp-net-core-mvc-mini.html