Мои выводы пока ...
В дополнение к PRISM, Unity, WPF и MVVM мы также используем Entity Framework и сетку данных Xceed. Профилирование памяти было выполнено с использованием dotTrace.
В итоге я реализовал IDisposable в базовом классе для своих моделей представлений, при этом метод Dispose (bool) был объявлен виртуальным, что позволило подклассам также очиститься.
Поскольку каждая модель представления в нашем приложении получает дочерний контейнер от Unity, мы также удаляем его, в нашем случае это гарантирует, что ObjectContext EF вышел из области видимости. Это был наш основной источник утечек памяти.
Модель представления располагается в явном методе CloseView (UserControl) базового класса контроллера. Он ищет IDisposable в DataContext представления и вызывает Dispose для него.
Сетка данных Xceed, по-видимому, вызывает значительную долю утечек, особенно при длительном просмотре. Любое представление, которое обновляет ItemSource сетки данных путем назначения новой коллекции, должно вызывать Clear () для существующей коллекции перед назначением новой.
Будьте осторожны с Entity Framework и избегайте любых длительных контекстов объектов. Это очень неумолимо, когда дело доходит до больших коллекций, даже если вы удалили коллекцию, если включено отслеживание, она будет содержать ссылку на каждый элемент коллекции, даже если вы их больше не держите.
Если вам не нужно обновлять объект, извлеките его с помощью MergeOption.NoTracking, особенно в долгоживущих представлениях, которые привязываются к коллекциям.
Избегайте представлений с длительным сроком службы, не держите их в пределах региона, когда они не видны, это вызовет у вас горе, особенно если они регулярно обновляют свои данные, когда они видны.
При использовании CellContentTemplates в столбце Xceed не используйте динамические ресурсы, поскольку ресурс будет содержать ссылку на ячейку, что, в свою очередь, поддерживает весь вид в действии.
При использовании CellEditor в столбце Xceed и сохранении ресурса в словаре внешних ресурсов добавьте x: Shared = "False" к ресурсу, содержащему CellEditor, еще раз ресурс будет содержать ссылку на ячейку, используя x: Shared = "False" гарантирует, что вы каждый раз получаете новую копию, причем старая удаляется правильно.
Будьте внимательны при привязке DelegateCommand к элементам в сетке данных Exceed. Если у вас есть случай, например кнопка удаления в строке, которая привязывается к команде, обязательно очистите коллекцию, содержащую ItemsSource, перед закрытием представления. Если вы обновляете коллекцию, вам также нужно повторно инициализировать команду, так как команда будет содержать ссылку на каждую строку.