【问题标题】:ExecuteCore() method in ASP.NET MVCASP.NET MVC 中的 ExecuteCore() 方法
【发布时间】:2013-05-09 01:59:57
【问题描述】:

我试图了解如何在 mvc 中调用控制器和操作。 经过大量阅读,我发现 ExecuteCore() 方法被执行,该方法存在于 Controller.cs 类中。

protected override void ExecuteCore()
{
    // If code in this method needs to be updated, please also check the BeginExecuteCore() and
    // EndExecuteCore() methods of AsyncController to see if that code also must be updated.

    PossiblyLoadTempData();
    try
    {
        string actionName = RouteData.GetRequiredString("action");
        if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
        {
            HandleUnknownAction(actionName);
        }
    }
    finally
    {
        PossiblySaveTempData();
    }
}

public IActionInvoker ActionInvoker
{
    get
    {
        if (_actionInvoker == null)
        {
            _actionInvoker = CreateActionInvoker();
        }
        return _actionInvoker;
    }
    set { _actionInvoker = value; }
}

protected virtual IActionInvoker CreateActionInvoker()
{
    // Controller supports asynchronous operations by default. 
    return Resolver.GetService<IAsyncActionInvoker>() ?? Resolver.GetService<IActionInvoker>() ?? new AsyncControllerActionInvoker();
}

当 ExecuteCore() 开始执行时,对 ActionInvoker 属性的引用会返回一个 IActionInvoker 类型。

IActionInvoker 由 AsyncControllerActionInvoker.cs 类实现,其中实现了 InvokeAction(ControllerContext, actionName) 方法。

所以我的问题是:

  1. IActionInvoker 接口如何在此处实例化,并由 ActionInvoker 属性返回?
  2. 对属性的引用是否返回 AsyncControllerActionInvoker 类的对象,以便我们可以使用该对象来调用 InvokeAction(ControllerContext, actionName) 方法。
  3. Resolver.GetService&lt;IAsyncActionInvoker&gt;()Resolver.GetService&lt;IActionInvoker&gt;() 有什么作用?

请帮助我理解这一点。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    ASP.NET 内置了一种依赖注入。

    这意味着控制器没有对特定类的硬引用,而是对接口的引用。然后将Resolver 配置为在请求实例时返回特定类型。例如(示例代码,我不知道确切的方法名)

    Resolver.Bind<IActionInvoker>().To<ActionInvoker>();   // if an IActionInvoker is requested, return an instance of type ActionInvoker.
    

    完成此配置后,调用GetService 将为您获取ActionInvoker 的实例

    所以,回答你的问题:

    1. IActionInvoker 接口如何在此处实例化,并由 ActionInvoker 属性返回?

    通过预先配置解析器,解析器知道要创建和返回哪种类型

    1. 对属性的引用是否返回 AsyncControllerActionInvoker 类的对象,以便我们可以使用该对象来调用 InvokeAction(ControllerContext, actionName) 方法。

    是和不是。是的,该属性将确保您有一个实现 IActionInvoker 的对象 您可以使用它来调用InvokeAction。不,您不能保证它是IAsyncActionInvoker 类型(取决于解析器的配置)

    1. Resolver.GetService() 和 Resolver.GetService() 有什么作用?

    他们要求解析器实例化一个实现给定接口的对象。解析器将在其配置中查找接口,实例化适当的对象并将其返回给调用者。

    依赖注入是一种解耦代码的方法。由于您只引用接口,因此您没有硬依赖,您只需重新配置 DI 容器(在本例中为Resolver),您将使用另一个类,而您的客户端类不知道它。

    【讨论】:

    • 非常感谢,对我理解这个话题很有帮助。您能否建议我一些链接,从中我可以了解有关此主题和内置依赖注入的 ASP.NET 的更多信息?
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 2015-05-30
    • 2020-09-03
    • 1970-01-01
    • 2011-08-16
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多