C # Слабая ссылка как значения в IDictionary, для кэша ViewModel в приложении WPF

#c# #wpf #mvvm #binding #weak-references

#c# #wpf #mvvm #привязка #слабые ссылки

Вопрос:

Я хотел бы подтвердить свое предположение.

Итак, у меня есть класс с именем, скажем, ViewModelProvider.

ViewModelProvider является одноэлементным и имеет

 IDictionary<string, WeakReference<ViewModelType>>
  

ViewModelType реализует INotifyPropertyChanged .

По сути, ViewModelProvider просто создает экземпляры ViewModelType и передает их, если он уже существует, он передает тот же экземпляр.

Потребители этих экземпляров ViewModelType просто отображают их, связывая их следующим образом:

 <ContentPresenter Content="{Binding VMInstance}" />
  

Экземпляры представлений создаются с использованием типизированных таблиц данных.

Со всем этим покончено.

Когда ViewModel привязан к данным, на его экземпляр неявно ссылается платформа WPF, подписывающаяся на обработчик PropertyChanged из INotifyPropertyChanged .

В течение этого времени, если я правильно понимаю, экземпляр ViewModelType удерживается как WeakReference, так и привязкой WPF. Правильно ли это?

Когда представление выгружается или уничтожается, в результате чего обработчик событий PropertyChanged не получает подписки, экземпляр ViewModelType теперь хранится ТОЛЬКО в WeakReference, что означает, что он может быть собран в любой момент времени с помощью GC, правильно ли это?

Каждый раз, когда кто-то запрашивает определенный ключ ViewModelType, мне нужно будет проверить, собран ли экземпляр, на который ссылается WeakReference, или нет, перед повторной инициализацией и передачей его обратно, это правильно?

Также кто-нибудь видит какие-либо проблемы с этим способом установки механизма кэша модели представления.

Спасибо.

Комментарии:

1. Использовали ли вы какой-либо контейнер DI в своем приложении? Почему вы не хотите передавать это задание о хранении ссылок и создании экземпляра в контейнер DI? Что, если вам нужно создать несколько разных представлений для одной и той же виртуальной машины? Что, если вы захотите получить несколько экземпляров виртуальной машины для одного и того же типа?