Озадаченный реализацией ASP.NET MVC DefaultControllerFactory.cs - PullRequest
4 голосов
/ 23 апреля 2009

При исследовании реализации моей собственной IControllerFactory я изучил реализацию по умолчанию DefaultControllerFactory и был удивлен, увидев, что свойство RequestContext устанавливается в методе CreateController(...), а затем на него ссылаются в GetControllerInstance(...) и GetControllerType(...) методы.

Причиной моего удивления является то, что, поскольку при запуске приложения создается экземпляр фабрики, один и тот же экземпляр используется для всех запросов, поэтому, если одновременно получено несколько запросов, у вас нет гарантии, какие запросы RequestContext были выполнены. установите свойство, когда вы его используете.

Есть ли гарантия в структуре MVC, что зарегистрированный IControllerFactory одновременно будет обслуживать только один запрос?

Если я что-то здесь упустил, пожалуйста, просветите меня, так как реализация моего контроллера будет проще, если у меня будет состояние между вызовами методов во время жизненного цикла запросов.

Спасибо.

EDIT:

Ответы даны, как я и ожидал, но упускаем суть вопроса. Дело в том, что DefautlControllerFactory, поставляемый как часть инфраструктуры MVC, хранит RequestContext, как если бы он имел состояние - посмотрите на источник.

Я считаю, что это неправильно, и ищу разъяснений (которые, я думаю, я вижу, поскольку оба ответа согласуются с моими мыслями). Я опубликовал кросс на форумах ASP.NET MVC.

Ответы [ 3 ]

4 голосов
/ 24 апреля 2009

Перекрестная публикация на форумах ASP.NET MVC показывает, что это ошибка в реализации DefaultControllerFactory.

Смотрите здесь для информации:

http://forums.asp.net/t/1414677.aspx

http://forums.asp.net/t/1404189.aspx

Однако в последнем посте показано, что вы можете создать фабрику контроллеров при каждом запросе, и в этом случае вы можете иметь состояние.

Из поста ...

ControllerBuilder.Current.SetControllerFactory(typeof(DefaultControllerFactory));

Это переключит режим построитель контроллера из экземпляра на основе на основе типа, и создаст новый экземпляр фабрики контроллеров на каждый запрос.

0 голосов
/ 24 апреля 2009

Нет. Метод фабрики контроллера CreateController выполняется для каждого запроса. При запуске приложения вы только предполагаете установить свой контроллер по умолчанию, а создание новой фабрики контроллеров состоит всего из трех строк кода:

public class CommonServiceLocatorControllerFactory : DefaultControllerFactory  
{  
  protected override IController GetControllerInstance(Type controllerType)  
  {  
    return (controllerType == null) ? base.GetControllerInstance(controllerType) 
     : ServiceLocator.Current.GetInstance(controllerType) as IController;  
  }
}  
0 голосов
/ 24 апреля 2009

Ваш вопрос: есть ли гарантия в структуре MVC, что зарегистрированный IControllerFactory будет одновременно обслуживать только один запрос?

Ответ: Нет, для сохранения состояния необходимо использовать блокировки.

Мой вопрос: почему вы хотите сохранить состояние на фабрике контроллеров?

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