0

我们正在使用 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 的文章,其中他有一个激活块并将所有内容包装在 using 语句中。我的问题是我的视图模型可以长时间运行,我不相信他的解决方案会在这里工作。同样,拥有一个休眠并调用 GC.Collect 的特殊线程也不好闻。

4

2 回答 2

1

InTransientScoped 对象的生命周期不由 Ninject 管理。这意味着这些对象不会被释放和停用。如果您的视图模型被注入到另一个对象,您可以使用命名范围扩展中的 InParentScope。请参阅我关于 Ninject 其他范围的博文:http ://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

于 2011-01-26T22:58:00.087 回答
0

卢卡斯 B,

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

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

于 2011-01-26T16:35:41.940 回答