Платформа объекта ObjectContext в windows/WPF/Silverlight приложении

Мы пишем приложение WPF с помощью платформы Объекта (Silverlight с сервисами RIA, чтобы быть точными). Мы используем общий ObjectContext через приложение так, чтобы мы могли извлечь выгоду из обмена данными через модули.

Проблема - если пользователь во время его работы открывает скажем, исторические продажи, она загружается в ObjectContext и остается там до конца приложения. Таким образом, другой шаблон должен использоваться.

Я знаю, что ObjectContexts должен использоваться в качестве единицы работы. Но затем, как Вы позволяете другим частям приложения знать, что что-то изменилось и они должны перезагрузить свои данные?

Править: Хорошо, EventAggregator, но затем, это заставило бы все другие части перезагружать их (вероятно, большая часть его дубликат) данные. Также, вероятно, многие событие были бы необходимы для всех типов групп объектов.

Как Вы решаете эти проблемы? Моим текущим решением является своего рода компромисс - используют общий ObjectContext для базовых данных, используемых целым приложением так, чтобы они могли быть совместно использованы и обновлены автоматически. И для большого объема данных, используйте новый отдельный ObjectContext. Какие-либо лучшие идеи?

Существует ли путь, как "выпустить" объекты из их DataContext так, чтобы Сборщик "мусора" мог сделать свое задание и освободить память?

5
задан gius 3 January 2010 в 23:35
поделиться

3 ответа

Подождите, это WPF или Silverlight? В данном случае они очень разные, и мой ответ был бы другим.

WPF Solution

В WPF я бы создал один ObjectContext на форме. Таким образом, контекст будет длиться столько же, сколько и сама форма. Затем вы должны реализовать систему событий, чтобы при сохранении изменений в сущности вы могли предупредить другие формы о том, что им может понадобиться обновление данных (INotifyPropertyChanged, например). Орен Айни написал довольно хорошую статью об этой архитектуре с использованием NHibernate в журнале MSDN. Вы должны иметь возможность получить архитектурную концепцию из его статьи.

Silverlight Solution

Теперь Silverlight - это другое. По сути, Silverlight позволяет иметь только одну форму в вашем приложении. Да, есть некоторые хитрости, которые вы можете сделать для навигации по корневому изображению формы к различным "страницам", но это все равно только одна форма, и пользователь не может открыть несколько окон в одной Silverlight RIA. Из-за этого я бы сделал один .Net RIA Services ObjectContext на экземпляр Silverlight RIA. Помните, что RIA Services не является действительным подключением к вашей базе данных, это просто объект кэширования и отслеживания изменений, связанный с веб службой. Поэтому вполне допустимо оставлять этот объект в существовании на более длительный период времени, поскольку он не связывает ресурсы сервера. Если ваш Silverlight RIA открывает несколько окон браузера или имеет более одного объекта Silverlight, то у вас должен быть один ObjectContext на каждый экземпляр Silverlight.

На сервере вы используете Entity Framework ObjectContext в веб-сервисе, и он должен работать только в течение одного запроса . Чем больше апатридов вы сможете сделать ваши сервисы, тем более масштабируемыми и производительными они будут. Вы хотите открыть EF ObjectContext, использовать его и закрыть как можно скорее.


EDIT:

Если все, что вы хотите сделать, это отделить объект от контекста объекта, то вы можете просто использовать метод context.Detach(entity). Пример можно найти в MSDN.

.
2
ответ дан 15 December 2019 в 06:27
поделиться

Вы можете использовать шаблон репозитория. Дополнительный уровень абстракции между UI и DAL.

Сделайте коллекции данных в репозитории статическими и наблюдаемыми. Затем всякий раз, когда репозиторий обновляет какой-либо из них, уровень пользовательского интерфейса должен наверстать упущенное. Просто идея.

1
ответ дан 15 December 2019 в 06:27
поделиться

Используйте "Наблюдаемые коллекции" в "Тексте объекта". Использовать событие, которое срабатывает на NotifyPropertyChange. Использовать шаблон публикации/подписки между моделями представлений, чтобы информировать их об изменении и использовать его для обновления других представлений.

.
0
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: