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.
两者都说他们提供了创建控制器的方法。那么,如果我想手动创建一个控制器,我应该使用哪个接口?它们之间有什么区别吗?
为了创建控制器实例,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)
andCreateController和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;
}
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)。
针对你的情况你能做什么?
IControllerFactory并根据需要创建控制器实例。在这种情况下,IControllerActivator除非您需要,否则不会使用。IControllerFactory,但提供您自己的IControllerActivator将使用的实现DefaultControllerFactory。| 归档时间: |
|
| 查看次数: |
1884 次 |
| 最近记录: |