我对IControllerFactory
和IControllerActivator
感到困惑。我试图手动创建控制器,因为我的项目需要它。因此,我查看了Microsoft文档。但是,这两个接口的描述都很混乱。
每个界面的说明
IControllerFactory :
Provides methods for the creation and disposal of controllers.
IControllerActivator :
Provides methods to create a controller.
他们都说他们提供了创建控制器的方法。因此,如果要手动创建控制器,应该使用哪个接口?它们之间有什么区别吗?
答案 0 :(得分:2)
为了创建控制器实例,ASP.NET Core获取IControllerFactory
的实例并将其用于控制器创建。
但是,如果您查看ASP.NET Core DefaultControllerFactory的实现,则会发现IControllerFactory
和IControllerActivator
实际上都用于控制器创建,因为{{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
的实例)。
您的情况下可以做什么?
IControllerPropertyActivator
的自己的实现,并根据需要创建控制器实例。在这种情况下,除非您需要使用IControllerFactory
。IControllerActivator
的默认实现,但是提供IControllerFactory
将使用的自己的IControllerActivator
实现。答案 1 :(得分:0)