1

我在我的MVC应用程序中有Castle Windsor Ioc。我注意到由发布策略计数跟踪的对象一直在成长,而且看起来这些对象从未发布(内存在成长)。MVC与Castle Windsor RegisterForDispose

的代码是:

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromThisAssembly() 
      .BasedOn<IController>() 
      .LifestyleTransient()); 
    } 
} 

在Global.asax中我有:

controllerFactory = new WindsorControllerFactory(); 
ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
controllerFactory.ValidateControllersResolution(); 

和类是:

public class WindsorControllerFactory: DefaultControllerFactory{ 
    private readonly IWindsorContainer container; 

    public WindsorControllerFactory() 
    { 
     container = new WindsorContainer() 
      .Install(FromAssembly.This()) 
      .AddFacility<WcfFacility>(); 
     default policy is: LifecycledComponentsReleasePolicy 
     //container.Kernel.ReleasePolicy; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     //this is called after each view return 
     container.Kernel.ReleaseComponent(controller); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      throw new HttpException(404, 
       $"The controller for path '{requestContext.HttpContext.Request.Path}' could not be found."); 
     } 

     var controller= ((IController)container.Kernel.Resolve(controllerType)).AddControllerLoggingFunctionality(); 
     return controller; 
    } 

    public void DisposeContainer() 
    {//this is never executed 
     container.Dispose(); 
    } 

在WEB API版本:Web API with Castle Windsor 有寄存器在返回控制器前配置:

request.RegisterForDispose(
     new Release(
      () => this.container.Release(controller))); 

但在我的情况下有RequestContext而不是HttpRequestMessage,它没有RegisterForDispose方法。查看还原后有没有其他方式注册配置或其他方式配置控制器?

或者我不在正确的轨道上?

+0

我很困惑,问题标题是MVC但是在MVC,释放完全由MVC中的ControllerFactory处理。你是说在你的ControllerFactory的ReleaseController方法不会被调用? –

回答

0

RegisterForDispose()方法仅在存在HttpRequestMessage因为它能够任意对象有用于通过其Properties收集所述请求的持续时间的请求相关联的。即使框架本身也使用它(例如,在GetOwinContext()中)。

另一方面,传统的HttpRequest(这是可用于MVC控制器)不公开此功能*因此没有提供RegisterForDispose()

*(尽管您可以将任意项目关联到HttpContext.Items,通常用于在模块之间传递数据。如果要使用它将项目与当前请求相关联,则必须手动将其置为以及

+0

你的意思是,如果我添加控制器项目集合,如:requestContext.HttpContext.Items [“x”] =控制器;我可以稍后访问它来处置它?但iController没有配置方法? “container.K ernel.ReleaseComponent(controller);“真正处置控制器并释放内存,因为容器属性:”释放策略跟踪的对象“一直在增长? – Simon