Получение общих данных в разных формах - PullRequest
1 голос
/ 03 марта 2011

Давайте рассмотрим пример приложения WinForms и выставления счета. В форме «Счет-фактура» мы получаем список продуктов, поэтому пользователь сможет выбрать продукты для текущего счета-фактуры. Давайте также учтем, что во время этого процесса пользователь понимает, что ему нужно добавить новый продукт (или отредактировать текущий) в ProductList, прежде чем он сможет разместить его в счете. Таким образом он открывает ProductForm, где все продукты получены (снова). Также может быть в обратном порядке, что пользователь сначала редактирует Продукты, а затем, не закрывая Форму продуктов, открывает новый Счет. Принцип заключается в том, что данные загружаются два раза, и фактически это одни и те же данные.

Как лучше справиться с этим сценарием, чтобы мы могли сообщить одной форме, что данные уже загружены, и извлечь эти данные из памяти? И когда все потребители (формы) данных закрыты, то также данные должны быть освобождены из памяти? Или я иду в неправильном направлении, и есть лучший путь?

Спасибо, Goran

Ответы [ 2 ]

1 голос
/ 03 марта 2011

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

Совместное использование данных означает совместное использование ObjectContext.Даже в приложении WinForms это считается плохим подходом.Проверьте эту статью (речь идет о NHibernate, но описание подходит и для EF).

Проблема в том, что ObjectContext является единицей работы.Если разделить контекст между двумя окнами, вы можете легко попасть в ситуацию, когда вы изменяете данные в первом окне (не сохраняя их!), И вы продолжаете во втором окне, где вы нажимаете кнопку «Сохранить», но это будет сохранять данные из обоих окон!Вы не можете выборочно сохранять данные только из одного окна при совместном использовании контекста.

1 голос
/ 03 марта 2011

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

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

Решение этой проблемы, если, как вы говорите, у вас уже есть элемент, используемый в одной форме, это просто добавить ссылку на этот элемент в вашу новую форму.

Таким образом, в случае, когда у вас есть счет-фактура со списком продуктов, и вы хотите добавить его в список продуктов, вы можете передать список продуктов из счета-фактуры в начальный список продуктов.

Есть некоторые проблемы с этим:

  • Если другой пользователь изменяет источник данных, когда он открыт (a.k.a. Параллелизм)
  • Обработка сохранения не сохраняет сценарии, в которых они могли внести изменения в одну область, которую они на самом деле не хотят добавлять в данные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...