0

インスタンス化されたときに web.config ファイルを現在読み取るクラスがあります。

このロジックを変更する必要があるため、読み取りは 1 回 (最初にインスタンスが作成されたとき) だけ行われ、データは存続期間中静的なままになります。

現在、私はこのC#コードを持っています

public AuthenticationProviderFactory()
{
    TraceManager = new Lazy<ITraceManager>(() => new TraceManager()).Value;

    AuthenticationProviders =
        new Lazy<IDictionary<string, IAuthenticationProvider>>(
            () => new Dictionary<string, IAuthenticationProvider>()).Value;

    Initialize();
}

複雑なことは何もありません。辞書を作成してから初期化します。

物事を単純にするために(このSOの質問では)Initialize()、web.configファイルからデータを読み取るだけとしましょう。どこかからデータを取得し、辞書に貼り付けます。

これを変更したいので、このクラスを初めて作成するときに、辞書を 1 回作成し (つまり、静的にする必要があります)、データを 1 回読み取ります。

私はこれを考えていましたが、これが受け入れられるかどうかはわかりません:-

private static Lazy<IDictionary<string, IAuthenticationProvider>> _authenticationProviders;
private static bool _hasParsedConfigFile = false;

public AuthenticationProviderFactory()
{
    TraceManager = new Lazy<ITraceManager>(() => new TraceManager()).Value;

    _authenticationProviders =
        new Lazy<IDictionary<string, IAuthenticationProvider>>(
            () =>
            {
                var authenticationProviders =
                    new Dictionary
                        <string, IAuthenticationProvider>();

                if (!_hasParsedConfigFile)
                {
                    Initialize();
                    _hasParsedConfigFile = true;
                }

                return authenticationProviders;
            });

    Initialize();
}

public static IDictionary<string, IAuthenticationProvider> AuthenticationProviders
{
    get { return _authenticationProviders.Value;  }
}

Lazy ディクショナリの作成をより良くしたと思う方法に注意してください.. lazy :P また、ここでの競合状態が問題を引き起こす可能性があるかどうか、および二重ヌルロックが必要になる可能性があるかどうかも疑問に思っています...しかし、聞いたことがありますその二重ヌルロックは、スレッドの安全性/競合状態、解決策としてはあまり優れていません。

誰にもいくつか提案がありますか?

4

1 に答える 1

0

静的コンストラクターでデータを初期化することをお勧めします。つまり、コードは

static AuthenticationProviderFactory()
{    
    AuthenticationProviders =
        new Lazy<IDictionary<string, IAuthenticationProvider>>(
            () => new Dictionary<string, IAuthenticationProvider>()).Value;

    Initialize();
}

ただし、クラスがアクセスされるとすぐにデータがロードされるため、遅延ロードは使用されません。

遅延読み込みを使用するには、次のような静的プロパティを提案します。

    private readonly object writeLock = new object();
    private static Lazy<IDictionary<string, IAuthenticationProvider>> _authenticationProviders;
    private static bool _hasParsedConfigFile = false;
    public static IDictionary<string, IAuthenticationProvider> AuthenticationProviders
    {
        get
        {
            if (!_hasParsedConfigFile)
            {
                lock (writeLock)
                {
                    if (!_hasParsedConfigFile)
                    {
                        _authenticationProviders = new Dictionary<string, IAuthenticationProvider>();
                        Initialize();
                        _hasParsedConfigFile = true;
                    }
                }
            }
            return _authenticationProviders;
        }
    }
于 2013-07-14T12:45:36.177 に答える