Мы используем 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, тоже не пахнет.