2009-04-06 5 views
0

Lors du démarrage de mon application, j'ai quelques classes qui sont nécessaires pour lire certains fichiers afin de créer un ensemble de données par défaut.Répondre aux événements de suppression des applications pendant l'initialisation de la classe

L'endroit logique (pour moi) pour faire ceci est dans un constructeur de classe partagé; l'idée serait de lancer un événement de niveau classe si la lecture du fichier par défaut échoue. Malheureusement, cela ne fonctionne pas car tenter d'accéder à un tel événement, afin d'y attacher un gestionnaire, déclenche le constructeur de la classe avant l'événement a été attaché. En cas d'échec, le constructeur démarre, déclenche l'événement fail, le constructeur termine, puis le gestionnaire d'événements est joint, après l'événement a été déclenché.

La seule autre solution que je peux penser est de donner à la classe un « typeInitialisedSuccessfully » propriété booléenne et mettre un bloc try/catch autour chaque appel pour construire une instance de la classe, ce qui semble inutilement kludgey pour moi.

Quelqu'un peut-il suggérer une solution plus élégante? EDIT: Parce que c'est une classe fondamentale, utilisée sous une forme ou une autre dans presque tous nos outils logiciels, je préférerais grandement une solution qui informe les futurs programmeurs que le type initialiser doit être appelé, c'est pourquoi Je suis d'abord allé vers le constructeur partagé comme une solution.

Répondre

2

Je suggère d'avoir une méthode Init (peut être statique) sur vos classes. Vous devez exécuter cette méthode sur le démarrage de votre application pour chacune de vos classes à initialiser. Dans ce cas, vous pouvez l'emballer en essayant d'attraper et d'agir en conséquence.

Re votre édition: En règle générale jeter des exceptions dans des endroits comme le constructeur est partagé mauvaise idée - vous ne pouvez pas vraiment l'attraper, il est difficile de prédire quand l'initialisation sera appelée etc.

Si vous spécifiez I Ajoutez d le champ IsInitialized qui serait vérifié et une exception levée lors de l'appel de la méthode/propriété qui l'exige. Cela peut cependant devenir fastidieux.

L'autre option que je voudrais peut-être être loin de votre architecture actuelle. Dans de nombreux outils IoC, ils utilisent le concept de Startable (castle, autofac), c'est-à-dire que vous spécifiez une interface avec une méthode de démarrage et que l'IoC vérifie que la méthode s'exécute à l'heure spécifiée (probablement au démarrage de l'application). Vous devez gérer vos erreurs dans votre méthode "Démarrer" et lancer une bulle contenant toutes les informations détaillées. Je pourrais m'étendre là-dessus, mais j'ai l'impression que ce n'est pas vraiment comme cela que vous iriez.

Questions connexes