【问题标题】:C# ASP.NET MVC Windows Service NULL out Static Instance Properties in Data Layer?C# ASP.NET MVC Windows 服务空出数据层中的静态实例属性?
【发布时间】:2011-06-09 17:02:57
【问题描述】:

这是我的场景。

我有一个包含 3 个项目的 ASP.NET MVC 解决方案。数据、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 windows-services static


    【解决方案1】:

    让我看看我是否直截了当。您有一个处理保存用户的库,它将计数值归零。它适用于 MVC,但不适用于您的 Windows 服务,因为它在您的 MVC 应用程序中不会被视为 null。

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

    如果我的回答是正确的,您是否知道事情不正常的原因。如果您卡在静态,请开始思考进程边界并询问“MVC 应用程序是否使用与 Windows 服务相同的进程”?

    简短回答:如果此功能位于库中,由两个单独的应用程序使用,则它的行为正确,因为每个应用程序都将自己的共享位和实例位存储在自己的进程空间中。它正在失效,但仅限于服务。

    治愈?让 Windows 服务调用 MVC 应用程序中的方法以指示它已更改的内容当然是一种选择。另一种方法是在值发生更改时使用不同的方法使用户计数无效。

    【讨论】:

    • 感谢格雷格的回答。你做对了一切,但我没有遗漏一件事。服务本身使用反射在处理处理的数据层中创建类的实例。这些处理类(在数据层中)然后调用与 web 相同的 CreateUser 方法。你上面的简短回答会保持不变吗?
    • 每个静态实例仅在特定进程空间内是静态的。即使对象在两个地方都通过反射实例化,它们仍然存在于某个空间内。您可以通过服务包装功能(例如)来解决这个问题,但这只是将静态实例迁移到由两个具有自己的进程空间的应用程序调用的单个进程空间(服务)。
    【解决方案2】:

    我认为问题在于您在两个不同的应用程序空间中进行操作。 Web 层和服务层各有其自己的应用程序空间,其中各有自己的静态属性。数据层只是一个加载到每个应用程序空间的程序集。只有将此数据持久化到磁盘或内存数据库中,您才会在每个应用程序空间中看到相同的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2012-11-01
      • 2011-08-03
      • 2011-09-18
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多