2009-04-06 5 views
0

Wenn ich meine Anwendung starte, habe ich ein paar Klassen, die benötigt werden, um bestimmte Dateien zu lesen, um eine Reihe von Standarddaten zu erstellen.Reagieren auf Anwendungstötungsereignisse während der Klasseninitialisierung

Der logische Ort (zu mir), dies zu tun, ist in einem Shared-Klassenkonstruktor; Die Idee wäre, ein Ereignis auf Klassenebene auszulösen, wenn das Lesen der Standarddatei fehlschlägt. Leider funktioniert dies nicht, da der Versuch, auf ein solches Ereignis zuzugreifen, um einen Handler an es anzuhängen, den Klassenkonstruktor auslöst, bevor das Ereignis angehängt wurde. In einem fehlgeschlagenen Fall wird der Konstruktor gestartet, löst das Fehlerereignis aus, der Konstruktor wird abgeschlossen und anschließend wird der Ereignishandler angefügt, nach das Ereignis wurde ausgelöst.

Die einzige andere Lösung, die ich denken kann, ist der Klasse eine „typeInitialisedSuccessfully“ boolean Eigenschaft zu geben und einen try/catch-Block setzt um jeden Aufruf eine Instanz der Klasse zu konstruieren, die mich unnötig kludgey scheint.

Kann jemand eine elegantere Lösung vorschlagen?

EDIT: Da dies eine grundlegende Klasse ist, die in fast jeder unserer Software-Tools in der einen oder anderen Form verwendet wird, würde ich eine Lösung bevorzugen, die zukünftige Programmierer darüber informiert, dass der Typinitialisierer aufgerufen werden muss Ich ging zunächst zum Shared Constructor als Lösung.

Antwort

2

Ich würde vorschlagen, eine Init (kann statische) Methode für Ihre Klassen sein. Sie würden diese Methode beim Start Ihrer Anwendung für jede zu initialisierende Klasse ausführen. In diesem Fall können Sie es in try fangen und entsprechend handeln.

Re Ihre edit: allgemeinen Ausnahmen in Orten wie Shared Konstruktor werfen ist keine gute Idee - man kann es wirklich nicht fangen, ist es schwer vorherzusagen, wann die init usw. aufgerufen wird

Falls Sie angegebenem würde entweder IsInitialized-Feld hinzufügen, das überprüft werden würde, und eine Ausnahme, die beim Aufrufen von Methode/Eigenschaft, die es erfordert, ausgelöst wird. Es kann jedoch langweilig werden.

Die andere Option, die ich wählen würde, könnte weit von Ihrer aktuellen Architektur entfernt sein. In vielen IoC-Tools verwenden sie das Konzept von Startable (castle, autofac) - d. H. Sie geben eine Schnittstelle mit einer Startmethode an und der IoC stellt sicher, dass die Methode zu einem bestimmten Zeitpunkt ausgeführt wird (am wahrscheinlichsten, wenn die Anwendung gestartet wird). Sie würden Ihre Fehlerbehandlung in Ihrer "Start" -Methode durchführen und die eingepackte Exception mit allen Detailinformationen aufblasen. Ich könnte das näher ausführen, aber ich habe das Gefühl, dass es nicht so ist, wie du es machen würdest.

Verwandte Themen