Преимущество интерфейса ICleanup
по сравнению с реализацией IDispose
(которая была там ранее) заключается в том, - как утверждает Лоран, - что вы можете вызывать его чаще и без маркировки виртуальной машины как утилизированной. Это означает, что вы должны вызывать ICleanup.Cleanup
всякий раз, когда вы хотите / должны отменить регистрацию обработки сообщений для вашей виртуальной машины. Очевидно, что в этом случае вам нужен метод, который снова регистрирует все обработчики сообщений, когда они понадобятся вам позже.
Лично я больше знаком с IDispose
способом очистки виртуальных машин, особенно потому, что я склонен к контейнерам IOC. Но я вижу случай Лорана, и реализация IDisposable
вызова Cleanup
на виртуальной машине - это не обман.
Как правило, момент времени, когда вы удаляете / очищаете виртуальную машину, зависит от того, как она была создана, и от срока службы объекта. Эти решения регулируются дизайном вашей заявки, и нет четких указаний для , когда вы должны это сделать. Но имейте в виду, что должен выполняться всякий раз, когда вы регистрируете обработчик сообщений в вашей модели представления - в других случаях это не является строго необходимым.
И, говоря о обработчиках сообщений, не забудьте также отменить их регистрацию в своих представлениях, когда вы зарегистрировали обработчик сообщений там (см. этот пост ). - Подумав, я поставлю здесь код, чтобы прояснить его и использовать в будущем:
В конструкторе вашего представления в коде файла добавьте следующий код, чтобы гарантировать, что зарегистрированные обработчики сообщений будут освобождены при выгрузке представления:
public MyView() {
this.Unloaded += (o, e) => { Messenger.Unregister(this); }
}