2009-04-23 55 views
4

在調查實施我自己IControllerFactory我看着默認實現DefaultControllerFactory,驚訝地看到被設置在CreateController(...)方法RequestContext屬性,然後在GetControllerInstance(...)被引用和GetControllerType(...)方法。疑惑的ASP.NET MVC DefaultControllerFactory.cs實施

令我驚訝的原因是,由於工廠在應用程序啓動時實例化,所有請求都使用相同的實例,所以如果同時收到多個請求,則不能保證已設置了哪些請求RequestContext當你來使用它的時候,你可以去財產。

是否有在MVC框架保證只有一個請求將由註冊IControllerFactory在同一時間提供服務?

如果我失去了一些東西在這裏,請賜教,爲我的控制器的implementaiton會更簡單,如果我有方法之間狀態的請求生命週期中調用。

謝謝。

編輯:

給出的答案是如我所料,但錯過了問題的要點。事實上,作爲MVC框架的一部分提供的DefautlControllerFactory正在存儲RequestContext,就好像它具有狀態一樣 - 查看源代碼。

我認爲這是錯誤的,我期待澄清(我想我已經看到,因爲兩者的答案跟我的想法一致)。我已經發布到ASP.NET MVC論壇。

+0

我不明白你的觀點。你能給個例子嗎? – Paco 2009-04-24 21:48:46

回答

4

跨發佈到ASP.NET MVC論壇上透露這是與DefaultControllerFactory錯誤實現。

在這裏看到的信息:

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

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

後者不過後發現,你可以有一個控制器工廠對每個請求instatiated,在這種情況下,你可以有狀態。

從帖子...

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

這將切換從基於實例的 類型的基於-到 控制器構建器的模式,並且將在 每個請求創建控制器廠的新 實例。

0

你的問題:有沒有在MVC框架保證只有一個請求會被註冊IControllerFactory在同一時間提供服務?

答:沒有,你必須使用鎖來存儲狀態。

我的問題:你爲什麼要存儲控制器出廠狀態?

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; 
    } 
}