c# - IControllerFactory 与 IControllerActivator asp.net core

标签 c# .net asp.net-core

我对 IControllerFactoryIControllerActivator 遇到了一些困惑。我试图手动创建 Controller ,因为我的项目需要它。于是,我查阅了微软的文档。然而,这两个接口(interface)的描述令人困惑。

每个接口(interface)的说明

<强> IControllerFactory : 提供创建和处置 Controller 的方法。

<强> IControllerActivator : 提供创建 Controller 的方法。

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

最佳答案

为了创建 Controller 实例,ASP.NET Core 获取 IControllerFactory 实例并使用它来创建 Controller 。

但是,如果您查看 ASP.NET Core DefaultControllerFactory实现后,您将看到 IControllerFactoryIControllerActivator 实际上都用于 Controller 创建,因为 DefaultControllerFactory 使用 IControllerActivator创建 Controller 的实例。

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 实现并根据需要创建 Controller 实例。在这种情况下,除非您需要,否则不会使用 IControllerActivator
  • 选项 2:使用 IControllerFactory 的默认实现,但提供您自己的 IControllerActivator 实现,该实现将由 DefaultControllerFactory 使用

关于c# - IControllerFactory 与 IControllerActivator asp.net core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56478849/

相关文章:

c# - 为 asp.net 创建自定义框架扩展的最佳方法是什么?

c# - 在 asp.net 中使用文本框拆分单词

c# - 如何获取包含 Excel 数据的列数

c# - 用空格替换所有不受支持的字符

azure - 在 Azure WebApp 中使用环境变量引用时如何解析 secret

c# - 一个查询的结果不能被枚举多次

c# - 如何在 NEST 中附加两个 SearchDescriptors

c# - .net core 2 的编码问题

asp.net-core - 如何在从右到左的文化本地化 ASP.Net core 2.2 应用程序中启用 RTL 模式?

ASP.net vnext 依赖注入(inject)