2012-08-02 72 views
3

我有一个MVC 4项目,并试图将PerWebRequest对象注入到我的控制器中。然而,它出现在对象没有被多个请求Castle Windsor 3在多个Web请求中保留了PerWebRequest对象

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

这里是我的PerWebRequestObject重建:

public class PerWebRequestObject 
{ 
    public DateTime DateCreated { get; set; } 

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

,这里是我的TestController:

public class TestController : BaseController 
{ 
    public PerWebRequestObject pwrObject { get; set; } 

    public ActionResult Test() 
    { 
     Debug.WriteLine(pwrObject.DateCreated.ToLongTimeString()); 
     return new ContentResult(); 
    } 
} 

这是为什么不工作?请注意,我使用的WindsorControllerFactory和释放,像这样的控制器:

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

     _windsorContainer.Release(controller); 
    } 
+1

http://stackoverflow.com/questions/11643594/castle-windsor-perwebrequest-lifestyle-is- not-hon-honored – 2012-08-02 14:19:34

+0

谢谢 - 刚试过这个,它肯定会在每次都产生一个新的请求,并创建一个新的控制器...不知道为什么我的PerWebRequestObject的行为像一个单身人士。它可能与我使用MVC4测试版相关吗? – doglobster 2012-08-07 09:04:53

回答

1

升级到Castle Windsor v3.1为我们解决了问题,无需更改任何代码。

我认为有一定是与温莎V3.0 + MVC的组合问题4.

5

两件事情:

  • 你怎么知道的对象不正确lifecycled(不能跨网络的请求重新创建)?

一个可能的解释是,你的依赖是这样的:

控制器 - >单身 - >您的每个Web请求分量

这是一种生活方式的不匹配,那会解释你正在玩的行为

  • 不配置控制器。这是集装箱的工作。