我已经遇到了IControllerFactory
和IControllerActivator
的某种困惑。我试图手动创建 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实现,则会看到IControllerFactory
和IControllerActivator
实际上都用于 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();
}
和
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
的实例)。您可以采取什么措施?
IControllerFactory
实现,并根据需要创建 Controller 实例。在这种情况下,除非您需要,否则将不使用IControllerActivator
。 IControllerFactory
的默认实现,但提供您自己的IControllerActivator
的实现,它将由DefaultControllerFactory
使用。