繁体   English   中英

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

[英]VB.net ASP.net class Library Project Shared (Static) variable inside public class

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

静态类和数据在ASP.NET会话之间共享。 期。 更改为Module ,因为_everything不会改变的问题”的Module共享如果你想为每个会话单独的实例,那么你就必须让他们‘不Shared ’,改变你的代码来存储实例会话:

Session("Logger") = new Logger()

我知道没有“ hack”可以在ASP.NET中按会话允许单独的Shared类。

最简洁的答案是不。

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM