English 中文(简体)
Should controller lifestyle always be transient in Windsor configuration for ASP.NET MVC?
原标题:

I ran into a problem where I had an Html.DropDownList in my view that would postback the selected value the first time I submitted the form, but each subsequent postback would only post data from the initial postback. So I added lifestyle="transient" to the component element where I had configured my controller for castle windsor, which fixed the problem, but of course made postbacks take longer since a new controller was being instantiated per request. Given the information above, what insight, suggestions, or solutions might help determine my original question about the controller lifestyle? Thanks for all the help and support!

最佳回答

MVC controllers are transient. Thinking about it, this makes sense for a few reasons. First, if a single instance is used to service multiple requests and if multiple requests happen to hit the same controller at the same time, you re going to experience some fairly bizarre race conditions. Second, HTTP is by its very nature stateless, and requests exist independently of one another. This is reflected in the transient lifestyle of controllers.

问题回答

Transient, yes, but for interest sake, why not PerWebRequest instead of Transient? I ve seen a couple of blogs that use PerWebRequest lifestyle and I can t think of a reason why not. Any answers?

I agree with Dion. Landed here looking for solution to this same question. It seems like PerWebRequest is more appropriate.

Depending on how you integrate your container into MVC and WebApi, you might not be instructing Windsor to release dependencies when your controller isn t being used anymore.

If you set it to PerWebRequest, it will automatically release your controller, and all its dependencies when the request ends

The use of Html.Action in Views leads potentially to more than one request per Controller, originating the error «A single instance of controller XPTO cannot be used to handle multiple request», if the Controller lifecycle was PerWebRequest.

Check Robert Muehsig (https://blog.codeinside.eu/2011/01/18/fix-a-single-instance-of-controller-foocontroller-cannot-be-used-to-handle-multiple-requests-mvc3/), here translated from German: «The problem occurs when you enter, for example, LifestyleType.WebRequest and call a controller several times via RenderAction - the framework doesn t like that and the fancy error message appears. The reason is simple: an HttpRequest arrives, so exactly one instance of the controller is created. He then wants to access this instance several times via RenderAction, which is probably not possible»»





相关问题
WebForms and ASP.NET MVC co-existence

I am trying to make a WebForms project and ASP.NET MVC per this question. One of the things I ve done to make that happen is that I added a namespaces node to the WebForms web.config: <pages ...

Post back complex object from client side

I m using ASP.NET MVC and Entity Framework. I m going to pass a complex entity to the client side and allow the user to modify it, and post it back to the controller. But I don t know how to do that ...

Create an incremental placeholder in NHaml

What I want to reach is a way to add a script and style placeholder in my master. They will include my initial site.css and jquery.js files. Each haml page or partial can then add their own required ...

asp.net mvc automapper parsing

let s say we have something like this public class Person { public string Name {get; set;} public Country Country {get; set;} } public class PersonViewModel { public Person Person {get; ...

structureMap mocks stub help

I have an BLL that does validation on user input then inserts a parent(PorEO) and then inserts children(PorBoxEO). So there are two calls to the same InsertJCDC. One like this=>InsertJCDC(fakePor)...

ASP.NET MVC: How should it work with subversion?

So, I have an asp.net mvc app that is being worked on by multiple developers in differing capacities. This is our first time working on a mvc app and my first time working with .NET. Our app does not ...

System.Web.Mvc.Controller Initialize

i have the following base controller... public class BaseController : Controller { protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (...

热门标签