C # ASP.NET Служба Windows MVC обнуляет свойства статического экземпляра на уровне данных?

#c# #asp.net #windows-services #static

#c# #asp.net #windows-services #статический

Вопрос:

Вот мой сценарий.

У меня есть ASP.NET Решение MVC с 3 проектами. Служба данных, веб и Windows. Уровень данных обладает статическими (не потокобезопасными) свойствами, которые передаются и получают данные один раз, в противном случае сохраняются в статическом частном поле. Смотрите ниже:

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

            return _userCount.Value;
        }
        set
        {
            _userCount = value;
        }
    }
  

Это отлично подходит для моих нужд. На веб-уровне я вызываю метод Service на моем уровне данных всякий раз, когда добавляю нового пользователя и устанавливаю UserCount = NULL Таким образом, при следующем посещении сайта он будет получать новое количество. Это тоже работает так, как ожидалось.

У меня также есть служба Windows, которая может создавать пользователей с помощью процесса импорта. Она вызывает тот же SaveUser метод, что и веб-уровень, который снова должен обнулять свойство UserCount. Тогда я бы подумал, что смогу зайти на веб-сайт, обновить страницу и снова получить новое количество пользователей. Однако это не так.

Я могу просмотреть код и увидеть, что служба попала в UserCount = NULL , но похоже, что веб-уровень не распознает его, даже если он вызывает то же свойство.

Я должен выполнять сброс IIS всякий раз, когда служба Windows вводит пользователя, чтобы очистить статические свойства. Есть мысли о том, почему это будет вести себя по-разному при создании пользователя в Службе по сравнению с веб-уровнем через пользовательский интерфейс?

Ответ №1:

Позвольте мне посмотреть, правильно ли я понял. У вас есть библиотека, которая обрабатывает save user, которая обнуляет значение count. Это работает в MVC, но не в вашей службе Windows, потому что в вашем приложении MVC оно не рассматривается как null.

Если я правильно понял, позвольте мне быть более откровенным. У вас есть библиотека для обработки пользователей, используемых вашим приложением MVC. Та же библиотека также используется службой Windows.

Если я правильно понял, вы поняли причину, покоторой что-то не работает? Если вы застряли на статике, начните обдумывать границы процесса и спросите: «Использует ли приложение MVC тот же процесс, что и служба Windows»?

Краткий ответ: Если эта функциональность находится в библиотеке, используемой двумя отдельными приложениями, она работает правильно, поскольку каждое приложение хранит свои собственные общие биты и биты экземпляра в своем собственном пространстве процессов. Это обнуление, но только для службы.

Лечение? Заставить службу Windows вызвать метод в приложении MVC, чтобы указать, что он что-то изменил, безусловно, является одним из вариантов. Другой способ заключается в использовании другого метода аннулирования количества пользователей при изменении значений.

Комментарии:

1. Спасибо за ответ, Грег. Вы все поняли правильно, но я не смог упустить одну вещь. Сама служба использует отражение для создания экземпляров классов на уровне данных, которые обрабатывают обработку. Затем эти обрабатывающие классы (на уровне данных) вызывают тот же метод CreateUser, что и web. Останется ли ваш краткий ответ выше прежним?

2. Каждый статический экземпляр является статичным только в пределах определенного пространства процесса. Даже если объекты создаются посредством отражения в обоих местах, они все равно находятся в определенном пространстве. Вы можете обойти это, обернув функциональность сервиса (например), но это просто переносит статический экземпляр в единое пространство процесса (service), вызываемое двумя приложениями с их собственным пространством процесса.

Ответ №2:

Я думаю, проблема в том, что вы работаете в двух разных прикладных пространствах. Веб-и сервисный уровни имеют свое собственное пространство приложений, в котором у каждого из них есть свои собственные статические свойства. Уровень данных — это просто сборка, которая загружается в каждое из прикладных пространств. Только если вы сохраните эти данные на диске или в базе данных в памяти, вы увидите одни и те же данные в каждом пространстве приложения.