Должен ли я определить один «DataContext» и передать ссылки на него или определить несколько «DataContext», где бы они мне ни понадобились? - PullRequest
0 голосов
/ 09 июня 2010

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

Не вдаваясь в подробности, допустим, у меня есть такая структура:

MainWindow
  Drawing-Surface
    Class1 -- Supports Drawing
      DataContext + DataServiceCollection<T> w/events
    Class2 -- Manages "transactions" (add/delete objects from drawing)
    Class3

Каждому «Классу» передается ссылка на поверхность рисования, чтобы они могли взаимодействовать с ней независимо.

Я начинаю использовать WCF Data Services в Class1, и он работает хорошо; однако другим классам также потребуется доступ к службам данных WCF. (Должен ли я определить свой «DataContext» в MainWindow и передать ссылку на каждый дочерний класс?)

Class1 потребуется доступ READ к данным «транзакций», а Class2 потребуется доступ READ к некоторым данным чертежа. Итак, мой вопрос: где имеет смысл определить мой DataContext?

Имеет ли смысл:

  1. Определить «глобальный» объект «Контекст» службы данных WCF и передать ссылки на него во всех моих последующих классах?
  2. Определить экземпляр «контекста» для каждого Class1, Class2 и т. Д.
  3. Может ли каждый метод, которому требуется доступ к данным, определить свой собственный экземпляр «контекста» и использовать замыкания для обработки событий асинхронной загрузки / завершения?

Будет ли такая структура иметь больше смысла? Есть ли какая-либо опасность в сохранении активного «DataContext» открытым в течение длительного периода времени? Типичный случай использования этого приложения может составлять от 1 минуты до 40+ минут.

MainWindow
  Drawing-Surface
  DataContext
    Class1 -- Supports Drawing
      DataServiceCollection<DrawingType> w/events
    Class2 -- Manages "transactions" (add/delete objects from drawing)
      DataServiceCollection<TransactionType> w/events
    Class3
      DataServiceCollection<T> w/events

1 Ответ

1 голос
/ 17 июня 2010

В общем, вы не должны держать контекст вокруг слишком долго.Контекст содержит ссылки на все сущности, которые вы получаете от него (если вы не отключите отслеживание изменений), и, таким образом, если вы удерживаете его, вы также удерживаете все сущности в памяти.Если ваш доступ только для чтения, то я бы действительно рассмотрел только время существования сущностей (и связанное с этим потребление памяти).Если у вас есть права на чтение и запись, то если у вас есть два контекста и вы вносите изменения в один объект из одного, другой не увидит его.Таким образом, вы, вероятно, хотите один контекст в этом случае.Но проблемы продолжительности жизни все еще имеют место.

Так что, если вы знаете, что не собираетесь использовать много разных сущностей, я бы использовал для простоты только один контекст (и он позволяет вам делиться экземплярами).Если вы знаете, что собираетесь использовать много сущностей, я бы подумал о том, чтобы время от времени удалять контекст (в каком-то логическом месте в вашем приложении).

...