2016-05-30 3 views
2

私は設定サーバーから構成を取り出し、静的変数を設定する静的ctorを持っています。スタティックctorが(マルチスレッド環境で)実行を完了する前にクラスのインスタンス(通常のctor)が作成される可能性はありますか?

私は、その構成に基づいていくつかのプロパティをインスタンス化する通常のctorを持っています。各要求はMyClassをインスタンス化し、DoSomething方法を実行し、私は複数の要求を受信WCFサービスを持っていると仮定すると

public class MyClass 
{ 
    private static MyConfig _config; 
    private UnitOfWork _uow; 

    static MyClass(){ 
     // This takes some time since it's a web service call!!! 
     _config = ConfigService.GetConfig(); 
    } 

    public MyClass(){ 
     _uow = CreateUow(_config.UOWConnectionString); 
    } 

    public Response DoSomething(){ 
     // logic with _uow 
    } 
} 

はここに私のクラスの例です。

スタティックctorは、結果が得られるまでに時間がかかるWebサービスコールを実行します。

のいずれかの要求のインスタンスがMyClassになる前に、スタティックctorの実行が終了することはありますか?

私は静的なctorsがスレッドセーフであることを知っています。

スタティックctorの実行が完了するまで、新しいインスタンスの作成はロックされていますか?

+2

これは_before_と呼ばれますが、どのインスタンスも作成されるため、確信できます。しかし、静的コンストラクタから_web service_を呼び出すことがどれほど難しいかを理解していただければ幸いです。 – Evk

+0

私はあなたのデザインを弱体化するのは嫌いですが、静的なコンストラクタを使って時間がかかる外部サービスを呼び出すことは、私にとっては本当に悪い考えのように思えます。 –

+0

@MarcGravell Evk - 答えてくれてありがとう。 デザインがベストプラクティスではないことを理解しており、より良い解決策を探しています。 設定サーバーから設定を取得するサービスがあると仮定すると、クラスをインスタンス化する前にconfigを取得するのに最適な方法は何ですか? 設定が必要なプロパティがいくつかあり、すべてのリクエスト(たとえば作業ユニット)でインスタンス化する必要があります。 ありがとうございます。 –

答えて

1

スタティックコンストラクタは、インスタンスが作成される前に実行されることが保証されています。 MSDNから。

は、静的コンストラクタは、最初のインスタンスが作成された、または任意の静的メンバが を参照される前にクラス を初期化するために自動的に呼び出されます。

+0

実際には、私は質問の中で起こった懸念、すなわち静的コンストラクターが既に実行されている間に別のスレッドからインスタンスコンストラクターが呼び出されていることに実際には気づいていません。 – Rotem

+0

@Rotem "最初のインスタンスの前に" –

関連する問題