IControllerFactory与IControllerActivator asp.net核心

时间:2019-06-06 13:39:40

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

我对IControllerFactoryIControllerActivator感到困惑。我试图手动创建控制器,因为我的项目需要它。因此,我查看了Microsoft文档。但是,这两个接口的描述都很混乱。

每个界面的说明

IControllerFactory Provides methods for the creation and disposal of controllers.

IControllerActivator Provides methods to create a controller.

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

2 个答案:

答案 0 :(得分:2)

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

但是,如果您查看ASP.NET Core DefaultControllerFactory的实现,则会发现IControllerFactoryIControllerActivator实际上都用于控制器创建,因为{{1} }使用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(); } CreateController方法基本上只是调用ReleaseController的相应方法:

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的实例)。

您的情况下可以做什么?

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

答案 1 :(得分:0)

大多数时候,如果我有这样的问题,我都会检查接口本身。 Factory

Activator

看到这一点,它告诉我Factory用于执行,Activator用于执行。