当控制器不从Controller类继承时,asp.net mvc 6如何知道要添加哪些资源?

Fel*_*ani 6 clr roslyn asp.net-core-mvc visual-studio-2015

我开始从asp.net mvc(6/vnext)学习内部,我有很多问题,但我想在这里保留一个.我正在使用Visual Studio 2015预览版,我在asp.net mvc 6(或vNext)中看到了一个新功能,即控制器不需要从Controller基类继承.我在asp.net MVC 4/5 Controller类(或其抽象)看见具有用于像资源的属性TempData,ViewData,ViewBag和方法一样View(),Json(),File()等.

现在,在新版本中,我们不需要从Controller基类继承.所以,我的问题是,当控制器不从Controller类继承时,asp.net mvc如何知道要添加哪些资源我看到我们可以添加一个属性,它将在运行时解析但是如何在asp.net核心中完成?是否有一个IoC在asp.net核心内工作来解决它?

Eil*_*lon 5

MVC 6基于公共类型并以后缀结尾来定位控制器Controller.现实比这更复杂,并且它也可以自定义以支持其他约定,但这是它的本质.

除此之外,MVC 6还有一个系统可以用所需数据"保湿"控制器(以及视图和其他特定类型).这主要是通过[Activate]告诉MVC调用依赖注入系统来填充类实例的依赖关系的属性来完成的.您甚至可以在内置Controller基类中看到如何完成此操作:

https://github.com/aspnet/Mvc/blob/2353bd911ac137e7858de5bef88af8f7eccaa49f/src/Microsoft.AspNet.Mvc.Core/Controller.cs#L92L99

namespace Microsoft.AspNet.Mvc
{
    public class Controller : ...
    {
        ...

        [Activate]
        public ActionContext ActionContext { get; set; }

        [Activate]
        public IUrlHelper Url { get; set; }

        [Activate]
        public IActionBindingContextProvider BindingContextProvider { get; set; }

        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是由DefaultControllerFactory这里触发的:

https://github.com/aspnet/Mvc/blob/2eef4dd3cf2964136dea9a144b1ee8c21df25c23/src/Microsoft.AspNet.Mvc.Core/DefaultControllerFactory.cs#L41

_controllerActivator.Activate(controller, actionContext);
Run Code Online (Sandbox Code Playgroud)

并且它使用a IControllerActivator,特别DefaultControllerActivator是扫描[Activate]属性并为属性赋值:

https://github.com/aspnet/Mvc/blob/c16214a53db7f16b06fd9b5a59fa1541e8ecd87a/src/Microsoft.AspNet.Mvc.Core/DefaultControllerActivator.cs