Для создания экземпляра контроллера 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
.