class View { Presenter presenter; View() { //service locators are smelly,but webforms forces this uglyness this.presenter = ServiceLocator.Get<Func<View,Presenter>>()(this); this.presenter.InitUI(); } } class Presenter { CookieContainer cookieContainer; View view; Presenter(View view,CookieContainer cookieContainer) { this.view = view; this.cookieContainer = cookieContainer; } } class CookieContainer { HttpRequest request; HttpResponse response; CookieContainer() { this.request = HttpRequest.Current.Request; this.response = HttpRequest.Current.Response; } } Bind<Func<View,Presenter>>().ToMethod(ctx => view => ctx.Kernel.Get<Presenter>(new ConstructorArgument("view",view))); Bind<Presenter>().ToSelf().InTransientScope(); Bind<CookieContainer>().ToSelf().InRequestScope();
这是导致问题的代码的表示.看起来发生的事情是CookieContainer的范围回调是HttpContext.Current,而CookieContainer也引用了HttpContext.Current.所以Ninject永远不会从其缓存中删除CookieContainer实例,因为CookieContainer实例保持其范围回调对象的活动.当我们将CookieContainer的范围更改为瞬态时,一切正常,正如我们预期的那样.但是我仍然不能完全确定为什么会发生这种情况,因为看起来这是一个相当传统的做法呢?也许不是……
我也很困惑,因为我认为如果回调对象保持活着,那么Ninject不应该只从缓存中移回相同的实例,看到回调仍然存在,所以实例应该看起来像范围?为什么ninject会继续获取CookieContainer的新实例并缓存它们?我想还有其他与错误对象相关的问题,但这至少只是一个错误,而不是内存泄漏.
我的问题是a)我们是否正确诊断出此错误? b)是否有建议采取的方法不再发生这种情况? c)我可以修复代码以检查这种类型的循环依赖性(假设我们已经正确诊断了这个)?
解决方法
但在InRequestScope的特殊情况下,OnePerRequestModule实现了另一个释放机制,它将在请求完成后立即释放所有InRequestScoped对象.如果您使用的是Ninject.Web或Ninject.Web.MVC3的最新版本,则会预先配置它.否则,您必须通过在web.config中配置此HTTPModule来显式添加它.
你不明白的另一点是Ninject只要它存在就不会返回同一个对象.例如.在请求范围内,它将为请求返回相同的对象.如果多个请求同时运行,则它们都会获得不同的实例.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。