Статическая коллекция и asp.net - PullRequest
2 голосов
/ 23 января 2012

Я разрабатываю общий слой, который позволяет мне выполнять основные операции сохранения, удаления и загрузки, однако натолкнулся на момент, на который я тоже не знаю ответа, и сразу подумал о StackOverflow.

У меня есть приложение asp.net, которое ссылается на отдельный проект (бизнес-уровень, который содержит все мои определения классов). Один из моих классов (ObjectFactory) занимается созданием экземпляров объектов и сохраняет их в статическом словаре (в частном порядке). Идея состоит в том, что, если он уже был создан, он получит свое определение из статической коллекции. Я решил сделать это, потому что я хочу получить propertyinfo [] класса только один раз, так как согласно статье MSDN Джоэла Побара получение этой информации довольно дорого.

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

Поскольку мой бизнес-уровень не имеет доступа к веб-кешу, я не уверен, стоит ли делать мой бизнес-уровень ссылкой на System.Web, а затем вставлять в него?

Извините, если я кого-то запутал, но я более чем рад предоставить дополнительную информацию, если потребуется.

Заранее спасибо, Онам.

Ответы [ 3 ]

3 голосов
/ 23 января 2012

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

1 голос
/ 23 января 2012

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

Таким образом, в дополнение к обеспечению безопасности элементов в словаре, вы должны использовать ConcurrentDictionary и его методы GetOrAdd и AddOrUpdate, чтобы обеспечить потокобезопасный доступ к самому словарю, в отличие от простого класса Dictionary, который не является потокобезопасным.

0 голосов
/ 23 января 2012

Регулярные статические поля доступны для всех потоков в течение данного жизненного цикла приложения.

В любом случае, будьте осторожны при использовании статических полей. Обратите внимание на тот факт, что обычный Dictionary<TKey, TValue> не является потокобезопасным.

Вам нужно будет подумать о блокировке других потоков в вашем словаре во время выполнения какой-либо операции записи (добавить, удалить ...), иначе у вас возникнут проблемы с синхронизацией (например, отраженная информация ваших свойств может быть добавлена ​​дважды - или больше -).

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