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

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

У меня есть решение 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, что и веб-слой, который снова должен иметь значение Null out свойства UserCount. Тогда я бы подумал, что смогу быть на сайте и обновить страницу, чтобы она снова получила счетчик новых пользователей. Однако, это не так.

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

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

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Дайте мне посмотреть, если у меня есть прямо. У вас есть библиотека, которая обрабатывает сохранение пользователя, которая обнуляет значение счетчика. Он работает в MVC, но не в вашей службе Windows, потому что в приложении MVC его не считают нулевым.

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

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

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

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

1 голос
/ 09 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...