为了创建控制器实例,ASP.NET Core 获取IControllerFactory 的实例并将其用于控制器创建。
但是,如果您查看 ASP.NET Core DefaultControllerFactory 实现,您会发现 IControllerFactory 和 IControllerActivator 实际上都用于创建控制器,因为 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 的默认实例唯一的附加功能是调用属性激活器(IControllerPropertyActivator 的实例)。
你可以做什么?
-
选项 1:提供您自己的
IControllerFactory 实现并根据需要创建控制器实例。在这种情况下,除非您需要,否则不会使用 IControllerActivator。
-
选项 2:使用
IControllerFactory 的默认实现,但提供您自己的 IControllerActivator 实现,DefaultControllerFactory 将使用该实现。