公共类中的VB.net ASP.net类库项目共享(静态)变量

本文关键字:net 共享 项目 静态 变量 类库 ASP VB | 更新日期: 2023-09-27 18:29:57

我们有一个类库项目,用于保存我们的基本数据定义、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会话中的问题。

公共类中的VB.net ASP.net类库项目共享(静态)变量

静态类和数据在ASP.NET会话之间共享。时期更改为Module不会改变问题,因为Module中的"所有东西"都是共享的。如果你想为每个会话拥有单独的实例,那么你必须使它们"不是Shared",并更改代码以将实例存储在会话中:

Session("Logger") = new Logger()

据我所知,在ASP.NET中没有允许按会话单独共享类的"破解"。

简短的回答是否定的。

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

要为不同的ASP.Net会话设置不同的值,必须将其放入会话字典中,这是无法解决的。

您可能还想了解线程问题。一般来说,ASP.Net是并发处理请求的,如果您有共享变量(即使在同一会话中),这些变量可能会被并发访问,并且您的代码需要是线程安全的。

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

我仍然更喜欢在winforms和asp.net中使用另一种方法,这样我们将来就可以转换为C#。

供参考代码的更改版本:

Public Module Generic
    Public CurrentDeviceUniqueIdentifier As String
    Public TimeDiffFromServer As Long
    Public myLogger As Logger
....
end Class