Вход на сайт
Веселая фича
NEW 15.01.13 11:07
Веселая фича
имеем следующую конструкцию:
private static string DefaultCstFolder = TTemplatesDll.TemplateDir;
TTemplatesDll - синглетон
TemplateDir - проперть, контролирующая доступ к полю. Проперть критична и потому отслеживает ситуацию с своей инициализацией - выкидывае Ехцептион если что не так. Инициализация происходит в начале.
Вопрос - Каким образом она может оказаться НЕ инициализированной в средине выполнения программы, когда инициализация DefaultCstFolder уже давно позади?
имеем следующую конструкцию:
private static string DefaultCstFolder = TTemplatesDll.TemplateDir;
TTemplatesDll - синглетон
TemplateDir - проперть, контролирующая доступ к полю. Проперть критична и потому отслеживает ситуацию с своей инициализацией - выкидывае Ехцептион если что не так. Инициализация происходит в начале.
Вопрос - Каким образом она может оказаться НЕ инициализированной в средине выполнения программы, когда инициализация DefaultCstFolder уже давно позади?

NEW 16.01.13 09:53
перед и после первого использования DefaultCstFolder сделать записи в лог.
На основании чего сделан данный вывод? Измени геттер для TemplateDir:
в ответ Murr 16.01.13 00:23
В ответ на:
Вопрос - Каким образом она может оказаться НЕ инициализированной в средине выполнения программы
Вопрос - Каким образом она может оказаться НЕ инициализированной в средине выполнения программы
перед и после первого использования DefaultCstFolder сделать записи в лог.
В ответ на:
когда инициализация DefaultCstFolder уже давно позади?
когда инициализация DefaultCstFolder уже давно позади?
На основании чего сделан данный вывод? Измени геттер для TemplateDir:
string TemplateDir
{
get
{
log.trace("TemplateDir: 1");
try
{
//перед return:
log.trace("TemplateDir: 2");
}
catch
{
log.trace("TemplateDir: 3");
throw;
}
}
}
что будет в лог файле?
16.01.13 13:32
в ответ Posmotrim 16.01.13 09:53
На основании чего сделан данный вывод?
-----
На основании лога. Есть запись об инициализации, есть записи об доступе и в конце есть запись об Ехцептионе...
Не мучайся - в этом коде проблем нет. Проблема есть в другом месте - там создается (не мною) второй инстансе синглетона и он - не инициализирован...
-----
На основании лога. Есть запись об инициализации, есть записи об доступе и в конце есть запись об Ехцептионе...

Не мучайся - в этом коде проблем нет. Проблема есть в другом месте - там создается (не мною) второй инстансе синглетона и он - не инициализирован...

NEW 16.01.13 17:15
в ответ Posmotrim 16.01.13 16:23
Хммм... Ну хорошо...
Где-то в недрах Linq происходит вызов приватного конструктора TTemplatesDll или класс инстанцируется без вызова.
Причина такого поведения, скорее всего в том, что Linq сам по себе инстанцирует обьекты и делает это где-то в отдельном блоке памяти.
Как результат - там действительно создается другой инстансе singleton'a TTemplatesDll и он непаравильно инициализирован.
Наверное есть какой-то метод как сообщить Linq что ему нужен полный клон обьекта, но мне было лениво копать и обошел по-другому - убрал статику.
Где-то в недрах Linq происходит вызов приватного конструктора TTemplatesDll или класс инстанцируется без вызова.
Причина такого поведения, скорее всего в том, что Linq сам по себе инстанцирует обьекты и делает это где-то в отдельном блоке памяти.
Как результат - там действительно создается другой инстансе singleton'a TTemplatesDll и он непаравильно инициализирован.
Наверное есть какой-то метод как сообщить Linq что ему нужен полный клон обьекта, но мне было лениво копать и обошел по-другому - убрал статику.
NEW 16.01.13 20:29
в ответ AlexNek 16.01.13 19:47
А тебе не кажется что в этом случае это просто не синглетон.
-----
Нее, не кажется... TTemplatesDll представляет единственную длл в системе... Мне просто вреден второй экземпляр...
Я так припоминаю, что уже была дискуссия по этому поводу... лет 5-6 назад...
-----
Нее, не кажется... TTemplatesDll представляет единственную длл в системе... Мне просто вреден второй экземпляр...
Я так припоминаю, что уже была дискуссия по этому поводу... лет 5-6 назад...