【问题标题】:IControllerFactory vs IControllerActivator asp.net coreIControllerFactory 与 IControllerActivator asp.net 核心
【发布时间】:2019-06-06 13:39:40
【问题描述】:

我对@9​​87654323@ 和IControllerActivator 感到困惑。我试图手动创建控制器,因为我的项目需要它。因此,我查看了 Microsoft 文档。但是,这两个接口的描述令人困惑。

每个接口的说明

IControllerFactoryProvides methods for the creation and disposal of controllers.

IControllerActivatorProvides methods to create a controller.

两者都说他们提供了创建控制器的方法。那么,如果我想手动创建一个控制器,我应该使用哪个接口呢?它们之间有什么区别吗?

【问题讨论】:

  • 看起来他们在处理方面有所不同。因此,当您不需要处理处置时,第二个可能是您的选择。否则第一个。
  • ControllerFactory 的作用是提供一个随时可用的控制器实例。为此,它在内部依赖ControllerActivator构造 所需的类型,然后通过进一步配置控制器的更多属性来继续创建 控制器。

标签: c# .net asp.net-core


【解决方案1】:

为了创建控制器实例,ASP.NET Core 获取IControllerFactory 的实例并将其用于控制​​器创建。

但是,如果您查看 ASP.NET Core DefaultControllerFactory 实现,您会发现 IControllerFactoryIControllerActivator 实际上都用于创建控制器,因为 DefaultControllerFactory 使用 IControllerActivator 创建一个控制器的实例。

DefaultControllerFactory 需要在构造函数中传递 IControllerActivator 类型的依赖项:

public DefaultControllerFactory(
    IControllerActivator controllerActivator,
    IEnumerable<IControllerPropertyActivator> propertyActivators)
{
    if (controllerActivator == null)
    {
        throw new ArgumentNullException(nameof(controllerActivator));
    }

    if (propertyActivators == null)
    {
        throw new ArgumentNullException(nameof(propertyActivators));
    }

    _controllerActivator = controllerActivator;
    _propertyActivators = propertyActivators.ToArray();
}

CreateControllerReleaseController方法基本上只是调用IControllerActivator的对应方法:

public object CreateController(ControllerContext context)
{
    ... some null checks

    // _controllerActivator is of type IControllerActivator
    var controller = _controllerActivator.Create(context);
    foreach (var propertyActivator in _propertyActivators)
    {
        propertyActivator.Activate(context, controller);
    }

    return controller;
}
public void ReleaseController(ControllerContext context, object controller)
{
    ... some null checks

    _controllerActivator.Release(context, controller);
}

IControllerFactory 的默认实例唯一的附加功能是调用属性激活器(IControllerPropertyActivator 的实例)。

你可以做什么?

  • 选项 1:提供您自己的 IControllerFactory 实现并根据需要创建控制器实例。在这种情况下,除非您需要,否则不会使用 IControllerActivator
  • 选项 2:使用 IControllerFactory 的默认实现,但提供您自己的 IControllerActivator 实现,DefaultControllerFactory 将使用该实现。

【讨论】:

  • 我在一个静态 HtmlHelper 类中,我正在尝试更新这些激活器,但我需要 ITypeActivatorCache,但我不知道如何创建它。我在这里有一个相关的问题。我被困住了,任何帮助将不胜感激:stackoverflow.com/questions/59620624/…
【解决方案2】:

大多数时候,如果我有这样的问题,我会检查界面本身。

看到这个,它告诉我Factory 用于执行,Activator 用于操作。

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2019-03-20
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多