0
何度も私がLazy<T>
パターンを実装する必要があると、Lazyの実装を隠すためにパターン全体をクラスに入れるという考えが私の頭に浮かんだ。これを行うにLazyをカプセル化する<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 Exceptio」と、それはコンパイルが、それは実行時に壊れますn "は
_loadConfiguration
をnullにすることはできません。それはSingletonConfigurationProvider
コンストラクタの前に怠惰が構築されているからでしょうか? - シングルトンの意味を壊さずに私が望むものを達成することは可能でしょうか?
基本的には、静的フィールドとゲッターという2行のコードの抽象化を構築しています。それは本当にそれの価値があるのですか? – Sinatr
_loadConfigurationがnullの場合、_lazyを初期化する最初の行に問題がある可能性があります。オーバーロードされたコンストラクタに初期化を移動してみてください。 – Sarathy
@Sarathyこの場合_lazyは読み取り専用ではありません –