我已经遇到了IControllerFactoryIControllerActivator的某种困惑。我试图手动创建 Controller ,因为我的项目需要它。因此,我查看了Microsoft文档。但是,这两个接口(interface)的描述都令人困惑。

每个接口(interface)的说明

IControllerFactory :Provides methods for the creation and disposal of controllers.
IControllerActivator :Provides methods to create a controller.
双方都说他们提供了创建 Controller 的方法。因此,如果要手动创建 Controller ,应该使用哪个接口(interface)?它们之间有什么区别吗?

最佳答案

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

但是,如果查看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使用。
  • 10-08 06:46