ViewModel Dispose не вызывается

Мы используем 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());

Но это заставило меня добавить две вещи: переопределение Unload в моем IDCardModule, которое извлекает объект и освобождает его:

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

и либо .InThreadScope (), либо .InSingletonScope () к моему методу Bind в Load.

Есть ли более простой способ принудительной деактивации определенного объекта? Или мне стоит изучить другую структуру МОК?

Я заглянул в IStartable и столкнулся с похожими проблемами. Кроме того, я подробно прочитал Статья Нейта, где у него есть блок активации и он оборачивает все в оператор using. Моя проблема в том, что моя модель представления может работать долго, и я не верю, что его решение сработает здесь. Кроме того, наличие специального потока, который спит и вызывает GC.Collect, тоже не пахнет.


person Lucas B    schedule 26.01.2011    source источник


Ответы (2)


Жизненный цикл объектов InTransientScoped не управляется Ninject. Это означает, что эти объекты не утилизируются и не деактивируются. Если ваша модель представления внедряется в другой объект, вы можете использовать InParentScope из названного расширения области. См. Мой блог о дополнительных возможностях Ninject: http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/

person Remo Gloor    schedule 26.01.2011

Лукас Б,

Я не уверен, что это поможет вам, но у меня были проблемы с удалением моих объектов, которые в некоторых случаях приводили к огромному использованию памяти. Я узнал, что это проблема подписки на мероприятие. Каждый раз, когда я подписывался на событие, я никогда не отказывался от подписки после его завершения. Насколько я понимаю, объект не уничтожается, если он все еще подписывается на событие ... Поэтому обязательно сделайте это (- =).

Надеюсь на эту помощь, даже если она не полностью связана с вашим сообщением.

person Renaud    schedule 26.01.2011