我有一個靜態ctor從我的配置服務器獲取配置並設置一個靜態變量。在靜態ctor完成運行之前(在多線程環境中),是否有機會創建類的實例(常規ctor)?
我有一個基於該配置實例化一些屬性的常規ctor。
這是我的類的一個實例:
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
}
}
假設我有一個WCF服務接收多個請求,每個請求實例MyClass
並運行DoSomething
方法。
靜態ctor執行Web服務調用,需要一些時間直到獲得結果。
我能否確定靜態ctor會在之前完成運行?任何請求都將收到MyClass
的實例?
我知道static ctors是線程安全的。
在創建新實例之前,是否有任何鎖定,直到靜態ctor完成運行?
它將被稱爲_before_任何實例創建,所以是的,你可以肯定。不過,我希望你明白從靜態構造函數中調用_web service_有多糟。 – Evk
我討厭破壞你的設計,但有一個靜態構造函數調用一個需要時間的外部服務(根據定義:可以失敗)看起來對我來說真的是個壞主意。 –
@MarcGravell Evk - 謝謝你的回答。 我知道設計不是最佳實踐,我正在尋找更好的解決方案。 假設你有一個從配置服務器獲取配置的服務,在實例化類之前獲取配置的最佳方法是什麼? 我有一些需要配置的屬性,需要在每個請求(例如工作單元)上實例化。 謝謝。 –