在ASP.NET MVC的Windsor配置中,控制器生活方式是否应该是瞬态的?

时间:2009-11-24 19:14:00

标签: asp.net-mvc castle-windsor ioc-container asp.net-mvc-controller

我遇到了一个问题,我的视图中有一个Html.DropDownList,它会在我第一次提交表单时回发所选的值,但每个后续的回发只会发布初始回发的数据。所以我将sports =“transient”添加到组件元素中,我已经为city windsor配置了我的控制器,这解决了问题,但当然回传需要更长的时间,因为每个请求实例化一个新的控制器。鉴于上述信息,有哪些见解,建议或解决方案可能有助于确定我对控制器生活方式的原始问题?感谢所有的帮助和支持!

4 个答案:

答案 0 :(得分:6)

MVC控制器是瞬态的。考虑到这一点,这有几个原因是有意义的。首先,如果单个实例用于服务多个请求,并且如果多个请求同时碰到同一个控制器,那么您将遇到一些相当奇怪的竞争条件。其次,HTTP本质上是无状态的,并且请求彼此独立存在。这体现在控制器的短暂生活方式上。

答案 1 :(得分:5)

瞬态,是的,但为了利息,为什么不用PerWebRequest代替Transient?我见过几个使用PerWebRequest生活方式的博客,我想不出有什么原因。有什么答案吗?

答案 2 :(得分:4)

我同意迪翁的观点。登陆这里寻找同样问题的解决方案。似乎PerWebRequest更合适。

根据您将容器集成到MVC和WebApi的方式,您可能不会指示Windsor在您的控制器不再使用时释放依赖关系。

如果您将其设置为PerWebRequest,它将在请求结束时自动释放您的控制器及其所有依赖项

答案 3 :(得分:0)

如果控制器生命周期是 PerWebRequest,则在视图中使用 Html.Action 可能导致每个控制器有多个请求,从而引发错误“控制器 XPTO 的单个实例不能用于处理多个请求”。

检查 Robert Muehsig (https://blog.codeinside.eu/2011/01/18/fix-a-single-instance-of-controller-foocontroller-cannot-be-used-to-handle-multiple-requests-mvc3/),这里是从德语翻译过来的: «例如,当您输入 LifestyleType.WebRequest 并通过 RenderAction 多次调用控制器时,就会出现问题 - 框架不喜欢那样,并且会出现花哨的错误消息。原因很简单:一个 HttpRequest 到达,所以控制器的一个实例被创建。然后他想通过 RenderAction 多次访问这个实例,这可能是不可能的»»