0
經過很多次我需要實現一個Lazy<T>
模式,它讓我想到了將整個模式放入類中以隱藏延遲實現的想法。封裝懶惰<T>
在「加載單配置對象爲我服務」的情況下,我做了這樣的事情:
public interface IConfigurationProvider<T>
{
T GetConfiguration();
}
public abstract class SingletonConfigurationProvider<TConfiguration> : IConfigurationProvider<TConfiguration>
{
private static readonly Lazy<TConfiguration> _lazy =
new Lazy<TConfiguration>(_loadConfiguration);
private static Func<TConfiguration> _loadConfiguration;
private SingletonConfigurationProvider() { }
public SingletonConfigurationProvider(Func<TConfiguration> LoadConfig)
{
_loadConfiguration = LoadConfig;
}
public TConfiguration GetConfiguration()
{
return _lazy.Value;
}
}
我的目標是獲得,從「外部」簡單在做這個:
public class ConfigTest : SingletonConfigurationProvider<ObjectTest>
{
public ConfigTest()
: base(Load)
{
}
public static ObjectTest Load()
{
return new ObjectTest()
{
testInt = 3,
testString = "Hi"
};
}
}
的要點是:
- 它編譯,但它打破了在運行時,用「TypeInitialization例外? n「表示
_loadConfiguration
不能爲空。是否因爲在構造函數SingletonConfigurationProvider
之前構造了懶惰? - 是否有可能實現我想要的而不破壞單身人士的語義?
你基本上是圍繞2行代碼構建一個抽象:靜態字段和getter。是不是真的值得嗎? – Sinatr
問題可能出現在_loadConfiguration爲空時初始化_lazy的第一行。嘗試將初始化移動到您的重載構造函數。 – Sarathy
@Sarathy在這種情況下_lazy不能只讀 –