ASP MVC: Когда IController, Располагают () названный?

Я сказал бы, что нет никакого предпочтительного метода, все это зависит от того, что Вы собираетесь сделать с ответом. Если бы результаты будут используемыми вместе в последующей обработке тогда, структуры имеют смысл, если не я был бы склонен передавать тогда как отдельные ссылки, если функция не была используемой в составном операторе:

x = divide( x, y, z ) + divide( a, b, c );

я часто принимаю решение 'раздать структуры' ссылкой в списке параметров вместо того, чтобы иметь передачу копией наверху возврата новой структуры (но это потеет маленький материал).

void divide(int dividend, int divisor, Answer &ans)

Отсутствуют сбивающие с толку параметры? Параметр, отправленный как ссылка, предполагает, что значение собирается измениться (в противоположность ссылке константы). Разумное именование также удаляет беспорядок.

82
задан Amirhossein Mehrvarzi 25 March 2015 в 15:13
поделиться

2 ответа

Dispose вызывается после визуализации представления, всегда .

Представление отображается в вызове ActionResult.ExecuteResult . Это вызывается (косвенно) ControllerActionInvoker.InvokeAction , который, в свою очередь, вызывается ControllerBase.ExecuteCore .

Поскольку контроллер находится в стеке вызовов при визуализации представления, он тогда нельзя утилизировать.

69
ответ дан 24 November 2019 в 09:19
поделиться

Просто чтобы расширить Ответ Крейга Стунца :

ControllerFactory обрабатывает, когда контроллер удаляется. При реализации интерфейса IControllerFactory одним из методов, который необходимо реализовать, является ReleaseController.

Я не уверен, какой ControllerFactory вы используете, независимо от того, использовали ли вы свой собственный, но в Reflector, глядя на DefaultControllerFactory, реализован метод ReleaseController. примерно так:

public virtual void ReleaseController(IController controller)
{
    IDisposable disposable = controller as IDisposable;
    if (disposable != null)
    {
        disposable.Dispose();
    }
}

Передается ссылка на IController, если этот контроллер реализует IDisposable, то вызывается метод Dispose этого контроллера. Итак, если у вас есть что-то, что вам нужно удалить после завершения запроса, то есть после визуализации представления. Наследуйте IDisposable и поместите свою логику в метод Dispose, чтобы освободить любые ресурсы.

Метод ReleaseController вызывается System.Web.Mvc.MvcHandler, который обрабатывает запрос и реализует IHttpHandler. ProcessRequest принимает предоставленный ему HttpContext и запускает процесс поиска контроллера для обработки запроса, вызывая реализованный ControllerFactory. Если вы посмотрите на метод ProcessRequest, вы увидите блок finally, который вызывает ReleaseController ControllerFactory. Это вызывается только тогда, когда контроллер возвратил ViewResult.

Если вы посмотрите на метод ProcessRequest, вы увидите блок finally, который вызывает ReleaseController ControllerFactory. Это вызывается только тогда, когда контроллер возвратил ViewResult.

Если вы посмотрите на метод ProcessRequest, вы увидите блок finally, который вызывает ReleaseController ControllerFactory. Это вызывается только тогда, когда контроллер возвратил ViewResult.

37
ответ дан 24 November 2019 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: