Утилизация ViewModels в Caliburn Micro и Касл Виндзор - PullRequest
5 голосов
/ 06 марта 2012

Я использую Castle-Windsor в качестве контейнера в приложении Caliburn-Micro Silverlight.Мои объекты ViewModel довольно короткие, так как они вызывают службы WCF и кучу других вещей.Поэтому, когда окно закрыто, я хочу вызвать container.Release (viewModel), чтобы Castle мог управлять всем процессом вывода из эксплуатации / утилизации, соблюдая различные настроенные жизненные циклы (как описано в в этом сообщении ).

В моем AppBootstrapper я переопределил GetInstance следующим образом:

protected override object GetInstance(Type serviceType, string key)
{
    if (string.IsNullOrEmpty(key)) return container.Resolve(serviceType);
    return container.Resolve(key, serviceType);
}

Но я изо всех сил пытаюсь найти чистый / элегантный способ вызова container.Release(viewModel).Кажется, для этого нет доступных крючков.

Каков самый простой способ освобождения объектов ViewModel, возвращаемых из ViewModelLocator в приложении Caliburn Micro?

1 Ответ

0 голосов
/ 16 марта 2012

Жизненный цикл, который вы хотите для каждого из ваших типов виртуальных машин, будет иметь здесь влияние, поэтому на самом деле нет правильного ответа для предоставленного вами контекста.

Базовый класс Screen CMпредоставляет вам protected virtual void OnDeactivate(bool close);, который является хорошим местом для начала.Для ваших тяжелых виртуальных машин вы должны переопределить этот метод, и если виртуальная машина закрывается, указанная параметром close, высвободить любые ресурсы (каналы WCF и т. Д.), Которые необходимо утилизировать, это будет включать в себя удаление ресурса (если IDisposable имеет значение), а также отключение любых ссылок на него, чтобы он мог быть очищен GC.

Я не использую Castle, поэтому не могу помочь вам с настройкой жизненных циклов и т. д. Но если вы будете следоватьвыше, вы не собираетесь держаться за что-нибудь тяжелое.Я предполагаю, что с правильной конфигурацией жизненного цикла Castle очистит все старые экземпляры, которые вы не собираетесь использовать снова без явного вызова Release.

...