ViewModel Dispose未被调用

时间:2011-01-26 15:58:00

标签: 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>().To<IdCardManagerClient>();
            Bind<IDCard.SL.ViewModel.IIdCardViewModel>().To<IDCard.SL.ViewModel.IdCardViewModel>();
        }
   }

在我的IIdCardViewModel中,我要求它继承自IDisposable,因为我想注册和取消注册wcf事件和一些本地非托管引用。

但是,Dispose永远不会被调用。

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

Bind<IDCardExclude.SL.ViewModel.IIdCardExclusionViewModel>().To<IDCardExclude.SL.ViewModel.IdCardExclusionViewModel>().OnDeactivation(
                m => m.Dispose());

但是这迫使我添加了两件事,一个是我的IDCardModule中的Unload覆盖,它检索了对象并释放了它:

var releaseMe = this.Kernel.Get<IIdCardViewModel>();
this.Kernel.Components.Get<Ninject.Activation.Caching.ICache>().Release(releaseMe);

和.InThreadScope()或.InSingletonScope()到Load中的Bind方法。

是否有更简单的方法强制停用特定对象?或者我应该研究另一个IOC框架?

我调查了IStartable并遇到了类似的问题。 同样,我深入阅读Nate's article,其中有一个激活块并将所有内容包装在using语句中。我的问题是我的视图模型可以长时间运行,我不相信他的解决方案可以在这里工作。同样,拥有一个睡眠并调用GC.Collect的特殊线程,也没有异味。

2 个答案:

答案 0 :(得分:1)

InTransientScoped对象生命周期不受Ninject管理。这意味着不会丢弃和停用theese对象。如果将视图模型注入另一个对象,则可以使用命名范围扩展中的InParentScope。请参阅我的博客文章,了解Ninject的其他范围:http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

答案 1 :(得分:0)

Lucas B,

我不确定这是否会对你有所帮助,但我对我的对象有处置问题,在某些情况下导致大量内存使用。我发现这是一个事件订阅的问题。每次订阅活动时,我都不会在活动完成后取消订阅。据我了解,如果一个对象仍在订阅某个事件,则不会销毁该对象......所以一定要这样做( - =)。

希望这个帮助,即使它与你的帖子不完全相关。