2016-01-12 2 views
0

У нас есть проект библиотеки классов, который использует наши основные определения данных, функции sql и общие функции. Эта библиотека классов используется в проекте winform и нашем проекте asp.net.VB.net ASP.net класс Библиотека Проект Общая (статическая) переменная внутри общедоступного класса

В одном из классов мы имеем общие настройки и общие переменные.

Public Class Generic 
    Public Shared CurrentDeviceUniqueIdentifier As String 
    Public Shared TimeDiffFromServer As Long 
    Public Shared myLogger As Logger 

.... 
end Class 

И они доступны в библиотеке классов также в проекте winform/asp.net.

If Generic.myLogger IsNot Nothing Then Generic.myLogger.WriteLog(...) 

Эти общие переменные не вызывает каких-либо неполадок Winform проект, так как есть один экземпляр этих переменных и система не имеет каких-либо проблем.

Но проект asp.net получает эти общие переменные, запутанные в разных сессиях, поскольку они являются общими.

Я мог бы преобразовать класс в модуль, так как система создана в VB вместо C#. Но не уверен, что это решит проблему. (Должно быть) В случае, если в будущем мы, возможно, захотим конвертировать в C#, и это не сработает.

Но мне было любопытно, есть ли другой способ обойти эту проблему, когда общие переменные блокируются в сеансе asp.net.

+0

Это прекрасно, чтобы иметь общий метод или свойство, которое используется различными пользовательскими сеансами в приложении ASP.Net. Так в чем проблема? – Sunil

+0

Статические (общие) значения * сами по себе * не вызывают никаких проблем. Но вы можете * использовать * их проблематичным образом, особенно в многопоточной многопользовательской среде. Что именно * * * проблема, которую вы видите? – David

+0

[Как выбрать между ....] (http://www.articlesbase.com/programming-articles/how-to-choose-from-viewstate-session-application-cache-and-cookies-443393.html) – Steve

ответ

0

Статические классы и данные разделяются между сессиями ASP.NET. Период. Изменение на Module не изменило бы проблему, так как _everything "в общем Module. Если вы хотите иметь отдельные экземпляры для каждого сеанса, вам придется сделать их« не Shared »и изменить свой код для хранения экземпляров в сеансе:

Session("Logger") = new Logger() 

Там нет «не рубить», что я в курсе, чтобы отдельные общие классы от сессии в ASP.NET.

+0

Невозможно преобразовать его в сеансовое кодирование, так как эта библиотека классов также используется внутри библиотеки классов, и эта библиотека классов используется внутри winforms также может вызвать проблемы. – drewex

0

короткий ответ: нет.

VB Общего переменного или C# статических переменных являются AppDomain широко (для практических целей вы можете думать об этом как о процессе) и поэтому у вас есть одно значение.

Чтобы иметь другое значение для разных сеансов ASP.Net, вы должны поместить его в словарь сеанса, нет никакого способа обойти это.

Возможно, вы также захотите посмотреть проблемы с потоками. В общем случае ASP.Net обрабатывает запрос одновременно, и если у вас есть общие переменные (даже в том же сеансе), к которым можно получить доступ одновременно, а ваш код должен быть потокобезопасным.

0

Теперь мне нужно было простое и быстрое решение внутри библиотеки классов. Преобразовал класс в модуль. Удалены все общие (статические) коды из всех переменных и функций. На данный момент все работает как в функциональности, так и в компиляции. Я надеюсь, что пересечение данных также будет разрешено. Я буду следить за журналами, чтобы убедиться, что это произойдет снова, но я сомневаюсь, что это произойдет.

Я по-прежнему предпочитаю другой способ сделать это, когда он работает в winforms и asp.net, чтобы мы могли конвертировать в C# в будущем.

Для справки изменил версию кода:

Public Module Generic 
    Public CurrentDeviceUniqueIdentifier As String 
    Public TimeDiffFromServer As Long 
    Public myLogger As Logger 

.... 
end Class 
+0

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

+0

просто удалить общий не работает, потому что объект, подобный logger, вызывается в одно время начальной страницы, но не отправляется на функции или другие классы. Shared используется для определения глобальной переменной да. Но IIS делает его слишком большим для всех сеансов, что вызывает проблему. Только другим способом я могу подумать о добавлении одинаковых параметров в каждый класс и назначении этого, но это изменит тонну кода. похоже, что модуль - единственный способ пойти прямо сейчас. Желание было другим способом. – drewex

+0

Ну, это не сработало, MODULE такой же, как и общий (статический) через приложение _domain, которое получает общий доступ. Мне нужно изменить каждый класс, чтобы получить объект для хранения общих разделяемых элементов, таких как логгер. класс blah dim myLogger as Logger и назначить его на вызовы класса и назначить ему вздох, это займет некоторое время. Так раздражает, что нет способа сделать это. – drewex