Реакция на события уничтожения приложений во время инициализации класса - PullRequest
0 голосов
/ 06 апреля 2009

При запуске приложения у меня есть пара классов, которые требуются для чтения определенных файлов, чтобы создать набор данных по умолчанию.

Логическое место (для меня) сделать это в конструкторе класса Shared; идея состояла бы в том, чтобы вызвать событие уровня класса, если чтение файла по умолчанию не удается. К сожалению, это не работает, поскольку попытка получить доступ к такому событию, чтобы прикрепить к нему обработчик, вызывает конструктор класса до события, которое было прикреплено. В случае сбоя конструктор запускается, запускает событие сбоя, конструктор завершается, а затем присоединяется обработчик события, после события сработало.

Единственное другое решение, которое я могу придумать, - это дать классу логическое свойство "typeInitialisedSuccessfully" и поместить блок try / catch вокруг каждый вызов для создания экземпляра класса, который кажется излишне запутанным для меня.

Может кто-нибудь предложить более элегантное решение?

РЕДАКТИРОВАТЬ: поскольку это фундаментальный класс, используемый в той или иной форме почти во всех наших программных инструментах, я бы предпочел решение, которое уведомит будущих программистов о необходимости вызова инициализатора типа, поэтому я Первоначально пошли к общему конструктору в качестве решения.

1 Ответ

2 голосов
/ 06 апреля 2009

Я бы предложил использовать метод Init (может быть статическим) в ваших классах. Вы запускаете этот метод при запуске приложения для каждого класса, который нужно инициализировать. В этом случае вы можете обернуть его в try catch и действовать соответственно.

Повторное редактирование: Обычно выбрасывать исключения в таких местах, как разделяемый конструктор, - плохая идея - вы не можете его поймать, трудно предсказать, когда будет вызван init и т. Д.

В случае, если вы укажете, я бы добавил либо поле IsInitialized, которое будет проверяться, и исключение, которое выдается при вызове метода / свойства, которые этого требуют. Хотя это может стать утомительным.

Другой вариант, который я выбрал бы, может быть далек от вашей текущей архитектуры. Во многих инструментах IoC они используют концепцию Startable ( castle , autofac ) - то есть вы указываете интерфейс с методом запуска, и IoC гарантирует, что метод будет запущен в указанное время (большинство скорее всего, когда приложение запущено). Вы будете выполнять обработку ошибок в своем методе «Пуск» и выдавать любую скрытую исключительную ситуацию со всей подробной информацией. Я мог бы уточнить это, но я чувствую, что на самом деле это не так, как вы хотели бы.

...