Хороший способ растянуть объект на несколько классов - PullRequest
1 голос
/ 12 декабря 2008

У меня есть коллекция заказов. Я хотел бы попасть в базу данных один раз, получить заказы, сохранить их, а затем получить доступ к этой коллекции через несколько форм. Я знаю, что в asp.net вы можете использовать такие вещи, как объект приложения или объект сеанса, но как вы делаете это в приложении win form? Я думал о создании статической коллекции, к которой можно было бы получить доступ через несколько форм, классов или где угодно. Звучит правильно и возможно ли это?

спасибо

Ответы [ 2 ]

1 голос
/ 12 декабря 2008

Принципиальная разница в WebForms и WinForms заключается в том, что WinForms сохраняют состояние. Другими словами, вы можете убедиться, что загруженные вами объекты доступны до тех пор, пока программа не будет закрыта. То же самое нельзя сказать о WebForms, так как HTTP не имеет состояния, а ASP.Net сплетает много «волшебства» [ViewState, сеанс сервера, файлы cookie, скрытые поля и т. Д.], Чтобы склеивать страницы веб-приложения.

С этой базовой концепцией легко сделать объект глобально доступным в WinForms. Используйте класс Singleton / Static и назначьте его членов. Вы всегда можете сказать .Instance .. [в случае статических классов / классов со статическими свойствами], чтобы получить значения из любой формы.

Один Gottcha "потокобезопасен" ... он же .. несколько форм, считывающих / записывающих в статическое свойство одновременно. Если вы можете позаботиться об этом, отдых на одном дыхании.

Для вашей вышеуказанной проблемы:

У вас может быть свой собственный класс Singleton Cache, который будет кэшировать записи. Класс Cache будет пользовательской реализацией коллекции. Вам нужно убедиться, что он поточно-ориентированный [или убедитесь, что ваше приложение загружается только один раз и читает с этого момента] ... Возможно, вам придется рассмотреть полноценный ORM, если вы хотите, чтобы изменения в базе данных отражались в ваших объектах сущностей. .

CacheList.OrderCache[orderNo].Customer.Address.City = "Las Vegas";</p> <p>class static CacheList { public static Cache OrderCache {get; internal set;}</p> <p>}</p> <p>public class Cache : CollectionBase where T : Entity { .....</p> <p>}

0 голосов
/ 12 декабря 2008

У вас должен быть какой-нибудь объект данных, который в любом случае обращается к базе данных, верно? Оберните это в класс CacheProxy, который попадет в базу данных, если у него нет локальной копии. Я слышал, что вы можете использовать кэш System.Web и в Winforms .

...