clr - asp.net mvc 6如何知道 Controller 不继承自Controller类时要添加哪些资源?

标签 clr roslyn visual-studio-2015 asp.net-core-mvc

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

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

最佳答案

MVC 6 根据公共(public)类型定位 Controller 并以后缀 Controller 结尾.实际情况比这要复杂一些,而且它也可以定制以支持其他约定,但这就是它的本质。

除此之外,MVC 6 有一个系统可以用所需的数据“水合” Controller (以及 View 和其他特定类型)。这主要是通过 [Activate] 完成的。该属性告诉 MVC 调用依赖注入(inject)系统以填充对类实例的依赖。您甚至可以在内置的 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; }

        ...
    }
}

这是由 DefaultControllerFactory 触发的这里:

https://github.com/aspnet/Mvc/blob/2eef4dd3cf2964136dea9a144b1ee8c21df25c23/src/Microsoft.AspNet.Mvc.Core/DefaultControllerFactory.cs#L41
_controllerActivator.Activate(controller, actionContext);

这使用 IControllerActivator ,尤其是 DefaultControllerActivator扫描 [Activate]属性并将值分配给属性:

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

关于clr - asp.net mvc 6如何知道 Controller 不继承自Controller类时要添加哪些资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27150835/

相关文章:

android - 如何在 xamarin android 中修复 "No way to resolve conflict between "System.Xml"?

c# - 虚拟和物理内存/OutOfMemoryException

c# - 将 Enumerable.ToDictionary 与扩展方法一起使用时为 "CLR detected an Invalid Program"

c# - 什么是 CLR 循环优化行为?

c# - 如何以编程方式获取类依赖项及其各自的文件位置?

c# - 源代码混淆

c# - 在 CSharpScript 的脚本类中访问全局变量

python - 致命的 Python 错误 : failed to get random numbers to initialize Python

visual-studio - 找不到 TemporaryGeneratedFile_GUID

mysql - ASPNET5 .Net Core 支持 MySql EntityFramework