@mletov

Почему страница помнит ранее созданный Singleton при генерации отчетов (npoi)?

Интересная штука

Есть у меня действие в контроллере для генерации xlsx файла при помощи NPOI примерно такого вида
public ActionResult GenerateReport(DateTime? dtStart, DateTime? dtFinish)
{
            //...

           //Создаем книгу через Singleton
           hssfwb = Hsswb.getInstance();
       
          //...

           //Отдаем результат
            MemoryStream output = new MemoryStream();
            HSSFFormulaEvaluator.EvaluateAllFormulaCells(hssfwb);
            hssfwb.Write(output);
            return File(output.ToArray(), "application/vnd.ms-excel", DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx");
}


Работа с книгой реализована через Singleton

protected static XSSFWorkbook hssfwb { get; set; }
     
        class Hsswb
        {
            private static XSSFWorkbook instance;

            private Hsswb()
            {

            }

            public static XSSFWorkbook getInstance()
            {
                if (instance == null)
                {
                    instance = new XSSFWorkbook();
                }
                return instance;
            }
        }


Вызывается генерация отчета вот так /Home/GenerateReport?dtStart=2017-04-10&dtStart=2017-04-17
Только даты меняются.
И получается, что после первой генерации отчета все остальные генерятся с теми же параметрами, с которыми сгенерил отчет в первый раз, т к вот эта проверка
if (instance == null)
                {
                    instance = new XSSFWorkbook();
                }


дает что instance не null, а экземпляр, созданный в первый раз.

Как так может получаться? В моем понимании, если я перегружаю страницу, да еще и с другими GET параметрами, все экземпляры классов должны создаваться заново, откуда старый экземпляр?
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
Young_khv
@Young_khv
ASP.NET Developer
Дык на то он и Singleton =) Даже если его звать из другого контроллера, то экземпляр будет один и тот же, который был создан при самом первом обращении.
Похоже, вам тут это совсем не нужно, почему бы не использовать new XSSFWorkbook() каждый раз?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@pro100gram
Программист-фрилансер
В моем понимании, если я перегружаю страницу, да еще и с другими GET параметрами, все экземпляры классов должны создаваться заново, откуда старый экземпляр?

Singleton существует на уровне приложения, а не на уровне запроса одного пользователя.
Ответ написан
@dmitryKovalskiy
программист средней руки
У вас не singleton, а непонятно что. Реализация паттерна Singleton должна быть потоко-безопасной. В вашем случае - это не так. Либо читайте больше про реализация паттерна, либо берите в руки IoC-контейнер и просите его контролировать количество объектов данного класса(т.е. не более 1)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы