Обновление кеша в Dependency Injection - PullRequest
0 голосов
/ 02 июля 2018

Я новичок в разработке на C #, поэтому все еще разбираюсь в нескольких вещах. Я стараюсь придерживаться хороших принципов проектирования, чтобы мой код можно было поддерживать. Таким образом, я строю приложение Line of Business, используя шаблоны MVVM и Factory. Я также использую Dependency Injection (Unity).

Мой вопрос касается обновления кэша данных, созданного с помощью Dependency Injection. Когда я создаю свою модель представления, кэш данных загружается следующим образом:

_container.RegisterType<IRepo<Relation>, RelationRepo>(new TransientLifetimeManager());

Мой сценарий состоит в том, что у меня есть данные, представленные пользователям в GridView. У меня многопользовательская среда с динамической информацией, поэтому вполне возможно, что время от времени данные в кэше устаревают. Это может привести, как и следовало ожидать, к ошибке DBConcurrency время от времени. То, с чем я сталкиваюсь, - это как правильно с этим справляться. Должен ли я прервать весь процесс и заставить пользователя перезагрузить приложение, воссоздав тем самым DI, или есть элегантный способ обновить кэш и повторно представить данные после предоставления необходимой информации пользователю. Используя опцию 2n'd, я мог бы, возможно, разместить кнопку обновления на экране или синхронизировать событие, чтобы обновить данные, чтобы пользователь мог видеть любые изменения в данных.

Итак, в основном я спрашиваю, как синхронизировать кэш с базовой базой данных в режиме реального времени?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 июля 2019

Хотя некоторое время назад я думал, что опубликую решение моей проблемы на тот случай, если кто-то еще столкнется с этими концепциями, как я.

Проблема заключалась в том, что я неправильно выбрасывал свою ViewModel, когда уходил от просмотра (или если была ошибка БД). Поэтому, когда я вернулся в View, EF DBContext все еще использовал локальное хранилище. то есть не утилизируется.

Впоследствии я реализовал Prism Framework и IRegionMemberLifetime в базовом классе, от которого наследуются все мои ViewModels. Это приводит к тому, что экземпляр ViewModel, помещенный в диспетчер регионов (IRegion), удаляется при переходе из активированного в деактивированное состояние.

Мой (псевдо) базовый класс выглядит так:

using Prism.Mvvm;
using Prism.Regions;

public MyBindableBase : BindableBase, IRegionMemberLifetime
{
    public virtual bool KeepAlive => false;
...
}
0 голосов
/ 02 июля 2018

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

В любом случае вам придется обрабатывать исключения параллелизма. Один из подходов, который вы можете использовать, чтобы уменьшить вероятность их появления, - распространение обновлений среди клиентов через SignalR. Используйте подход, при котором одно обновление будет распространяться через концентратор SignalR среди всех других клиентов. Тем не менее, обновление может передаваться через несколько секунд после одновременного обновления, и для этого потребуется некоторая функция пользовательского интерфейса, чтобы объяснить, что что-то изменилось.

...