gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:36:27 25 4
gpt4 key购买 nike

我开始研究 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com