VB.net ASP.net类库公共类中的Project Shared(Static)变量

时间:2016-01-12 18:42:21

标签: c# asp.net vb.net

我们有一个类库项目用于保存我们的基本数据定义,sql函数和泛型函数。这个类库用于或winform项目和我们的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会话。

3 个答案:

答案 0 :(得分:0)

静态类和数据在ASP.NET会话之间共享。期。更改为Module不会改变问题,因为_ethingthing"在Module中共享。如果您希望每个会话都有单独的实例,那么您必须制作它们"而不是Shared"并将您的代码更改为在会话中存储实例:

Session("Logger") = new Logger()

没有" hack"我知道在ASP.NET中通过会话允许单独的共享类。

答案 1 :(得分:0)

简短的回答是否定的。

VB共享变量或C#静态变量是AppDomain范围的(出于实际目的,您可以将其视为进程范围),因此您只有一个值。

要为不同的ASP.Net会话设置不同的值,您必须将它放在Session字典中,没有办法解决这个问题。

您可能还想查看线程问题。一般来说,ASP.Net进程并发请求,如果你有共享变量(即使在同一个会话中),可能会同时访问,你的代码需要是线程安全的。

答案 2 :(得分:0)

现在我需要在类库中使用简单快速的解决方案。将类转换为模块。从所有变量和函数中删除了所有共享(静态)代码。截至目前,它在功能和编译方面都起作用。我希望也应该解决数据交叉问题。我会密切关注日志,看看它是否会再次发生,但我怀疑它会发生。

我仍然喜欢在winforms和asp.net中运行的另一种方法,以便将来转换为C#。

参考更改版本的代码:

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

....
end Class