IControllerFactory vs IControllerActivator asp.net ядро - PullRequest
3 голосов
/ 06 июня 2019

Я столкнулся с некоторой путаницей с IControllerFactory и IControllerActivator. Я пытался создать контроллеры вручную, потому что это требуется моим проектом. Итак, я посмотрел документацию Microsoft. Однако описания обоих интерфейсов сбивают с толку.

описания для каждого интерфейса

IControllerFactory : Provides methods for the creation and disposal of controllers.

IControllerActivator : Provides methods to create a controller.

Оба говорят, что они предоставляют методы для создания контроллеров. Итак, если я хочу создать контроллер вручную, какой интерфейс я должен использовать? Есть ли разница между ними?

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Для создания экземпляра контроллера 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.
0 голосов
/ 06 июня 2019

В большинстве случаев, если у меня есть такие вопросы, я проверяю сами интерфейсы.Factory

Activator

Видя это, он говорит мне, что Factory для выполнения и Activator длядействие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...