在调查实现我自己的IControllerFactory
时,我查看了默认实现DefaultControllerFactory
,并惊讶地发现在RequestContext
方法中设置了CreateController(...)
属性,然后在GetControllerInstance(...)
和GetControllerType(...)
方法中引用。
令我惊讶的是,由于工厂在应用程序启动时实例化,所有请求都使用相同的实例,因此如果同时收到多个请求,则无法保证哪些请求RequestContext
当你来使用它时已被设置为该属性。
MVC框架中是否保证一次只有一个请求由注册的IControllerFactory
提供服务?
如果我在这里遗漏了一些内容,请告诉我,因为如果我在请求生命周期中的方法调用之间有状态,那么我的控制器的实现会更简单。
感谢。
编辑:
给出的答案正如我所料,但却错过了问题的要点。事实上,作为MVC框架的一部分提供的DefautlControllerFactory正在存储RequestContext,就像它具有状态一样 - 查看源代码。
我认为这是错误的,我正在寻求澄清(我认为我已经看到这两个答案都符合我的想法)。我已经发布了ASP.NET MVC论坛。
答案 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;
}
}