IControllerFactory 与 IControllerActivator asp.net 核心

Har*_*han 7 .net c# asp.net-core

我遇到了一些与IControllerFactory和的混淆IControllerActivator。我试图手动创建控制器,因为我的项目需要它。因此,我查看了 Microsoft 文档。然而,这两个接口的描述令人困惑。

各接口说明

控制器工厂Provides methods for the creation and disposal of controllers.

IControllerActivator : Provides methods to create a controller.

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

Mar*_*pic 4

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

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

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

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();
}
Run Code Online (Sandbox Code Playgroud)

andCreateControllerReleaseController方法基本上只是调用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;
}
Run Code Online (Sandbox Code Playgroud)
public void ReleaseController(ControllerContext context, object controller)
{
    ... some null checks

    _controllerActivator.Release(context, controller);
}
Run Code Online (Sandbox Code Playgroud)

的默认实例所做的唯一额外的事情IControllerFactory是调用属性激活器( 的实例IControllerPropertyActivator)。

针对你的情况你能做什么?

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