3

したがって、クライアントにオブジェクトを提供する WCF サービスがあります。私たちの wcf サービスは、データ アクセス レイヤー (DAL) からデータを取得します。DAL は API からデータを取得し、使用できるオブジェクトにフォーマットします。ほとんどのオブジェクトでは、これでうまくいきます。

しかし、API からのオブジェクトのリストも必要であり、オブジェクトは変更されません。API に対するクエリには 15 ~ 20 秒かかります。同じデータに対してこのクエリを複数回実行するには時間がかかります。そのため、リストをメモリに保存したいと思います。DBA は私たちの親友ではなく、SQLite や SQL CE は選択肢にないからです。

これで、グループが初めてロードされるときに、それらをプライベートな静的変数に格納することができます。これはこのようなことをする正しい方法ですか、それとももっと良い方法がありますか?


    public static class GroupStore
    {
        private static DTO.Group[] _groups;

        public static DTO.Group[] GetAll()
        {
            if (_groups == null)
            {
                var dal = PluginHandler.Instance.GetPlugin();
                _groups = dal.GetAll();
            }
            return _groups;
        }
    }
4

1 に答える 1

4

.NET4 を使用している場合は、Lazy<T>クラスを使用できます。これはスレッド セーフであり、遅延読み込みをラップします。

コードはもう少しきれいになります。

public static class GroupStore
{
    private static Lazy<DTO.Group[]> _groups = new Lazy<DTO.Group[]>(GetAll);

    public static DTO.Group[] Groups { get { return _groups.Value; } }

    private static DTO.Group[] GetAll()
    {
        var dal = PluginHandler.Instance.GetPlugin();
        return dal.GetAll();
    }
}

アップデート

コメントでリンクした回答は OK です。ただし、IsValueCreated理由なくロックを使用します (チェックと次のアクセスの間でリストが変更された可能性があるため)。

「ToString」get が呼び出された場合も値を作成しません。

もう少しきれいな解決策:

public sealed class Lazy<T> where T : class
{
    private readonly object _syncRoot = new object();
    private readonly Func<T> _factory;
    private T _value;

    public Lazy(Func<T> factory)
    {
        if (factory == null) throw new ArgumentNullException("factory");

        _factory = factory;
    }

    public T Value
    {
        get
        {
            if (_value == null)
            {
                lock (_syncRoot)
                {
                    if (_value == null)
                    {
                        _value = _factory();
                    }
                }
            }
            return _value;
        }
    }

    public override string ToString()
    {
        return _value == null ? "Not created" : _value.ToString();
    }
}
于 2012-06-08T11:37:18.633 に答える