关于ASP.NET MVC DefaultControllerFactory.cs实现的困惑

时间:2009-04-23 13:35:44

标签: asp.net-mvc model-view-controller

在调查实现我自己的IControllerFactory时,我查看了默认实现DefaultControllerFactory,并惊讶地发现在RequestContext方法中设置了CreateController(...)属性,然后在GetControllerInstance(...)GetControllerType(...)方法中引用。

令我惊讶的是,由于工厂在应用程序启动时实例化,所有请求都使用相同的实例,因此如果同时收到多个请求,则无法保证哪些请求RequestContext当你来使用它时已被设置为该属性。

MVC框架中是否保证一次只有一个请求由注册的IControllerFactory提供服务?

如果我在这里遗漏了一些内容,请告诉我,因为如果我在请求生命周期中的方法调用之间有状态,那么我的控制器的实现会更简单。

感谢。

编辑:

给出的答案正如我所料,但却错过了问题的要点。事实上,作为MVC框架的一部分提供的DefautlControllerFactory正在存储RequestContext,就像它具有状态一样 - 查看源代码。

我认为这是错误的,我正在寻求澄清(我认为我已经看到这两个答案都符合我的想法)。我已经发布了ASP.NET MVC论坛。

3 个答案:

答案 0 :(得分:4)

交叉发布到ASP.NET MVC论坛显示这是DefaultControllerFactory实现的错误。

请参阅此处了解相关信息:

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

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

然而,后一篇文章显示您可以在每个请求上设置控制器工厂,在这种情况下您可以拥有状态。

从帖子......

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

这将切换模式   控制器构建器来自基于实例的   以类型为基础,并将创建一个新的   控制器工厂的实例   每一个请求。

答案 1 :(得分:0)

您的问题:MVC框架中是否保证一次只有一个请求由注册的IControllerFactory提供服务?

答案:不,你必须使用锁来存储状态。

我的问题:为什么要在控制器工厂中存储状态?

答案 2 :(得分:0)

没有为每个请求执行Controller工厂CreateController方法。在应用程序启动时,您只需设置默认控制器并创建新的控制器工厂只需三行代码:

public class CommonServiceLocatorControllerFactory : DefaultControllerFactory  
{  
  protected override IController GetControllerInstance(Type controllerType)  
  {  
    return (controllerType == null) ? base.GetControllerInstance(controllerType) 
     : ServiceLocator.Current.GetInstance(controllerType) as IController;  
  }
}