【问题标题】:Should controller lifestyle always be transient in Windsor configuration for ASP.NET MVC?在 ASP.NET MVC 的 Windsor 配置中,控制器的生活方式是否应该始终是瞬态的?
【发布时间】:2010-12-20 00:30:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 哈哈。我可能想多了,根本没有考虑到这一点。感谢您的洞察力。可能对我的问题是肯定的,但我在温莎盒子里想了太多,无法实现解决方案。非常感谢!
    • 可能值得指出的是,在没有定义生活方式的情况下,将使用默认的“Singleton”。难怪这会引起问题。
    • 嗨,好奇一件事,为什么我们把 Controller 作为瞬态但 ApiController 需要作用域而不是瞬态?由于两者都在服务http请求。我的怀疑。 cangencer.wordpress.com/2012/12/22/…
    【解决方案2】:

    Transient,是的,但是为了兴趣,为什么不用 PerWebRequest 而不是 Transient?我看过一些使用 PerWebRequest 生活方式的博客,但我想不出为什么不这样做的原因。有答案吗?

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        如果控制器生命周期是 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 多次访问这个实例,这可能是不可能的»»

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 2020-07-23
          • 2018-08-23
          • 1970-01-01
          • 1970-01-01
          • 2018-10-24
          相关资源
          最近更新 更多