我在我的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方法。查看还原后有没有其他方式注册配置或其他方式配置控制器?
或者我不在正确的轨道上?
我很困惑,问题标题是MVC但是在MVC,释放完全由MVC中的ControllerFactory处理。你是说在你的ControllerFactory的ReleaseController方法不会被调用? –