C#ASP.NET MVC Windows服务NULL输出数据层中的静态实例属性

本文关键字:静态 属性 实例 数据 输出 MVC NET Windows 服务 NULL C#ASP | 更新日期: 2023-09-27 17:58:43

这是我的场景。

我有一个ASP。NET MVC解决方案,包含3个项目。数据、Web和Windows服务。数据层具有静态(非线程安全)属性,一旦数据存储在静态私有字段中,它就会去获取数据。见下文:

    private static int? _userCount;
    public static int UserCount
    {
        get
        {
            if (!_userCount.HasValue)
            {
                _userCount = GetUserCount();
            }
            return _userCount.Value;
        }
        set
        {
            _userCount = value;
        }
    }

这非常适合我的需要。在Web层中,每当添加新用户并设置UserCount = NULL时,我都会调用数据层中的Service方法。因此,下次网站受到攻击时,它将获取新的计数。这也如预期的那样有效。

我还有一个Windows服务,可以通过导入过程创建用户。它调用与web层相同的SaveUser方法,该方法应该再次清空UserCount属性。然后我想我应该能够在网站上刷新页面,并再次获得新的用户数。然而事实并非如此。

我可以遍历代码,看到服务命中了UserCount = NULL,但它就像web层无法识别它,即使它正在调用相同的属性。

每当Windows服务引入用户时,我必须执行IIS重置,以清除静态属性。有什么想法吗?为什么在服务层创建用户与通过UI在Web层创建用户会有不同的行为?

C#ASP.NET MVC Windows服务NULL输出数据层中的静态实例属性

让我看看我是否有这个问题。您有一个处理保存用户的库,该库将计数值置空。它在MVC中工作,但在windows服务中不工作,因为它在MVC应用程序中不会被视为null。

如果我有正确的答案,让我更明确一点。您有一个库来处理MVC应用程序正在使用的用户。windows服务也在使用同一个库。

如果我说得对的话,你明白事情不起作用的原因了吗。如果你停留在静态,开始思考流程边界,并问"MVC应用程序是否使用与windows服务相同的流程"?

简言之:如果此功能在库中,由两个独立的应用程序使用,则它的行为是正确的,因为每个应用程序都在自己的进程空间中存储自己的共享位和实例位。它是无效的,但只是为了服务。

治愈?让windows服务调用MVC应用程序中的一个方法来表明它已经改变了事情,这当然是一种选择。另一种方法是在值发生变化时使用不同的方法使用户计数无效。

我认为问题在于您在两个不同的应用程序空间中操作。Web层和服务层都有自己的应用程序空间,在这些应用程序空间中,它们都具有自己的静态属性。数据层只是加载到每个应用程序空间中的程序集。只有将这些数据保存到磁盘或内存中的数据库中,才能在每个应用程序空间中看到相同的数据。