Castle Windsor 3 Persiste a los objetos de PERWEBREQUEST a través de múltiples solicitudes web -- asp.net campo con castle-windsor campo con perwebrequest camp Relacionados El problema

Castle Windsor 3 persists PerWebRequest objects across multiple web requests


3
vote

problema

Español

Tengo un proyecto de MVC 4 y estoy tratando de inyectar un objeto PERWEBREQUEST en mi controlador. Sin embargo, parece que el objeto no está siendo recreado en múltiples solicitudes

   private static IWindsorContainer InitializeWindsor()     {         var container = new WindsorContainer().Install(FromAssembly.This());          // Add Factory facility         container.AddFacility<TypedFactoryFacility>();          // Register all controllers from this assembly         foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())         {             container.Register(                 AllTypes.FromAssembly(assembly).BasedOn<Controller>().Configure(c => c.LifestyleTransient())                 );         }          // Register HTTP Handlers         container.Register(Component.For<HttpRequestBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpRequestWrapper(HttpContext.Current.Request)));         container.Register(Component.For<HttpContextBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));           // Register components         container.Register(Component.For<PerWebRequestObject>().LifeStyle.PerWebRequest); }   

Aquí está My PERWEBREQUESTOBJECT:

  public class PerWebRequestObject {     public DateTime DateCreated { get; set; }      public PerWebRequestObject()     {         DateCreated = DateTime.UtcNow;         Debug.WriteLine("Created: " + DateCreated.ToLongTimeString());     } }   

Aquí está My TestController:

  public class TestController : BaseController {     public PerWebRequestObject pwrObject { get; set; }      public ActionResult Test()     {         Debug.WriteLine(pwrObject.DateCreated.ToLongTimeString());         return new ContentResult();     } }   

¿Por qué esto no funciona? Tenga en cuenta que estoy usando el WindsorControllerFactory y liberando el controlador así:

      public override void ReleaseController(IController controller)     {         var disposableController = controller as IDisposable;         if (disposableController != null)             disposableController.Dispose();          _windsorContainer.Release(controller);     }   
Original en ingles

I have an MVC 4 project and am trying to inject a PerWebRequest object into my controller. However it appears the object is not being recreated across multiple requests

 private static IWindsorContainer InitializeWindsor()     {         var container = new WindsorContainer().Install(FromAssembly.This());          // Add Factory facility         container.AddFacility<TypedFactoryFacility>();          // Register all controllers from this assembly         foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())         {             container.Register(                 AllTypes.FromAssembly(assembly).BasedOn<Controller>().Configure(c => c.LifestyleTransient())                 );         }          // Register HTTP Handlers         container.Register(Component.For<HttpRequestBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpRequestWrapper(HttpContext.Current.Request)));         container.Register(Component.For<HttpContextBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));           // Register components         container.Register(Component.For<PerWebRequestObject>().LifeStyle.PerWebRequest); } 

Here's my PerWebRequestObject:

public class PerWebRequestObject {     public DateTime DateCreated { get; set; }      public PerWebRequestObject()     {         DateCreated = DateTime.UtcNow;         Debug.WriteLine("Created: " + DateCreated.ToLongTimeString());     } } 

Here's my TestController:

public class TestController : BaseController {     public PerWebRequestObject pwrObject { get; set; }      public ActionResult Test()     {         Debug.WriteLine(pwrObject.DateCreated.ToLongTimeString());         return new ContentResult();     } } 

Why is this not working? Note that I'm using the WindsorControllerFactory and releasing the Controller like so:

    public override void ReleaseController(IController controller)     {         var disposableController = controller as IDisposable;         if (disposableController != null)             disposableController.Dispose();          _windsorContainer.Release(controller);     } 
        
 
 

Lista de respuestas

5
 
vote

DOS COSAS:

  • ¿Cómo sabe que el objeto no está correctamente lifecilado (no re-creado en las solicitudes web)?

Una explicación posible es que su dependencia se ve así:

controlador - & gt; un singleton - & gt; su componente de solicitud por web

Este es un desajuste de estilo de vida, y eso explicaría el comportamiento que está buscando

  • No deseche el controlador. Eso es el trabajo del contenedor.
 

Two things:

  • how do you know the object is not lifecycled properly (not re-created across web-requests)?

One possible explanation is that your dependency looks like this:

controller --> a singleton --> your per-web-request-component

this is a lifestyle mismatch, and that would explain the behaviour you're seing

  • do not dispose the controller. That's container's job.
 
 
1
 
vote
vote
La mejor respuesta
 

Actualización a Castle Windsor V3.1 Se solucionó el problema para nosotros sin necesidad de cambiar ningún código.

Supongo que debe haber sido un problema con la combinación de Windsor V3.0 + MVC 4.

 

Upgrading to Castle Windsor v3.1 fixed the issue for us without needing to change any code.

I assume there must've been an issue with the combination of Windsor v3.0 + MVC 4.

 
 

Relacionados problema

5  ¿Cuál es el estilo de vida del inyector simple "por solicitud" correcto para usar en una aplicación API de MADRICESTACK?  ( What is the correct per request simple injector lifestyle to use in a services ) 
Tengo una aplicación API de servicio que utiliza un inyector simple como su contenedor de IOC. Necesito ciertos componentes para tener un estilo de vida 'por ...

2  Windsor PerwebRequest Resolución en Application_Start  ( Windsor perwebrequest resolution in application start ) 
Estoy inyectando httpcontextbase en una clase de almacenamiento en caché. HTTPContextBase está registrado como PERWEBREQUEST. Interactué con la clase de almac...

3  Castle Windsor 3 Persiste a los objetos de PERWEBREQUEST a través de múltiples solicitudes web  ( Castle windsor 3 persists perwebrequest objects across multiple web requests ) 
Tengo un proyecto de MVC 4 y estoy tratando de inyectar un objeto PERWEBREQUEST en mi controlador. Sin embargo, parece que el objeto no está siendo recreado e...

5  castillo perrequestlifestyle no reconoce  ( Castle perrequestlifestyle not recognize ) 
Nuevo en Castle / Windsor, por favor soporta conmigo. Actualmente estoy usando el marco system.web.mvc.extensibilidad y en su código de inicio, registró h...

1  El estilo de vida de PERWEBREQUEE Falta en Castle Windsor 3.2  ( Perwebrequest lifestyle missing in castle windsor 3 2 ) 
Estaba usando el estilo de vida de PERWEBREQUEST de Castle Windsor (versión 3.0.0.4001). Quería actualizarlo a la última versión (3.2). En la última versión, ...

3  Algunos objetos creados con PerwebRequest no están recolectados basura al final de la solicitud web  ( Some objects created with perwebrequest are not garbage collected at the end of ) 
dado public class a : IDisposable { public static int counter; public a() { counter++; } ~a() { counter--; } ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos