0

アプリケーションを起動するとき、デフォルト データのセットを作成するために特定のファイルを読み取るために必要なクラスがいくつかあります。

(私にとって) これを行う論理的な場所は、Shared クラスのコンストラクターです。デフォルトファイルの読み取りが失敗した場合、クラスレベルのイベントをスローするという考えです。残念ながら、このようなイベントにアクセスしようとすると、ハンドラーをアタッチするために、イベントがアタッチされる前にクラス コンストラクターが起動されるため、これは機能しません。失敗した場合、コンストラクターが開始され、fail イベントが発生し、コンストラクターが完了し、イベントが発生したにイベント ハンドラーがアタッチされます。

私が考えることができる他の唯一の解決策は、クラスに「typeInitializedSuccessfully」ブール値プロパティを与え、クラスのインスタンスを構築するためのすべての呼び出しの周りに try/catch ブロックを配置することです。

誰かがよりエレガントなソリューションを提案できますか?

編集:これは基本的なクラスであり、ほぼすべてのソフトウェアツールで何らかの形で使用されるため、将来のプログラマーに型初期化子を呼び出す必要があることを通知するソリューションが非常に望ましいと考えています。ソリューションとして共有コンストラクター。

4

1 に答える 1

2

クラスに Init (静的にすることができます) メソッドを用意することをお勧めします。初期化するクラスごとに、アプリケーションの開始時にこのメソッドを実行します。その場合、それを try catch でラップして、それに応じて動作させることができます。

あなたの編集について:一般的に、共有コンストラクターのような場所で例外をスローすることは悪い考えです-実際にキャッチすることはできません.initがいつ呼び出されるかを予測することは困難です.

指定する場合は、チェックされる IsInitialized フィールドと、それを必要とするメソッド/プロパティを呼び出すときにスローされる例外のいずれかを追加します。ただし、面倒になる可能性があります。

私が選択するもう 1 つのオプションは、現在のアーキテクチャとはかけ離れている可能性があります。多くの IoC ツールでは、Startable ( Castle 、 autofac ) の概念を使用しますつまり、開始メソッドでインターフェイスを指定すると、IoC は指定された時間 (ほとんどの場合、アプリケーションの開始時) にメソッドが実行されるようにします。「Start」メソッドでエラー処理を行い、すべての詳細情報を含むラップされた例外をバブルアップします。これについて詳しく説明することはできますが、実際にはあなたが進むべき道ではないと感じています.

于 2009-04-06T07:30:59.297 に答える