Silverlight 4.0 未调用ViewModel Dispose

Silverlight 4.0 未调用ViewModel Dispose,silverlight-4.0,.net-4.0,c#-4.0,ninject-2,caliburn.micro,Silverlight 4.0,.net 4.0,C# 4.0,Ninject 2,Caliburn.micro,我们正在使用Ninject和Caliburn.Micro创建一个MVVM WCF Silverlight应用程序。我遇到的问题是视图模型的生命周期 我创建了一个简单的ninject模块来绑定视图模型和wcf客户端 public class IDCardModule : NinjectModule { public override void Load() { Bind<IIdCardManagerClient>().

我们正在使用Ninject和Caliburn.Micro创建一个MVVM WCF Silverlight应用程序。我遇到的问题是视图模型的生命周期

我创建了一个简单的ninject模块来绑定视图模型和wcf客户端

   public class IDCardModule : NinjectModule
   {
        public override void Load()
        {
            Bind<IIdCardManagerClient>().To<IdCardManagerClient>();
            Bind<IDCard.SL.ViewModel.IIdCardViewModel>().To<IDCard.SL.ViewModel.IdCardViewModel>();
        }
   }
公共类IDCardModule:Ninject模块
{
公共覆盖无效负载()
{
绑定()到();
绑定()到();
}
}
在我的IIdCardViewModel中,我要求它从IDisposable继承,因为我想注册和取消注册wcf事件和一些本地非托管引用

但是,从未调用Dispose

我考虑添加一个停用来调用dispose,如下所示:

Bind<IDCardExclude.SL.ViewModel.IIdCardExclusionViewModel>().To<IDCardExclude.SL.ViewModel.IdCardExclusionViewModel>().OnDeactivation(
                m => m.Dispose());
Bind()(
m=>m.Dispose());
但这迫使我添加了两件事,IDCardModule中的卸载覆盖检索并释放了该对象:

var releaseMe = this.Kernel.Get<IIdCardViewModel>();
this.Kernel.Components.Get<Ninject.Activation.Caching.ICache>().Release(releaseMe);
var releaseMe=this.Kernel.Get();
this.Kernel.Components.Get().Release(releaseMe);
并将.InThreadScope()或.InSingletonScope()加载到我的Bind方法中

是否有更简单的方法强制对特定对象禁用?还是应该研究另一个国际奥委会框架?

我调查了IStartable,发现了类似的问题。 此外,我还深入阅读了一篇文章,其中他有一个激活块,并将所有内容封装在一个using语句中。我的问题是我的视图模型可能会长期运行,我不相信他的解决方案会在这里起作用。还有,有一个特殊的线程可以休眠并调用GC.Collect,这闻起来也不对

我不确定这是否对你有帮助,但我的对象也有处理问题,在某些情况下导致大量内存使用。我发现这是一个事件订阅的问题。每次我订阅一个活动,在活动结束后我都不会取消订阅。据我所知,如果一个对象仍然订阅一个事件,它就不会被销毁。。。所以一定要这样做(-=)


即使这与您的帖子不完全相关,也希望能有所帮助。

IntransientScope对象生命周期不由Ninject管理。这意味着这些对象不会被释放和停用。如果将视图模型注入到另一个对象,则可以使用命名范围扩展中的InParentScope。请参阅我的博客文章,了解Ninject的其他作用域: