访问修饰符 - 只能加载一次

时间:2016-05-30 08:44:37

标签: c# oop

我们可以阻止在我的应用程序中多次加载以下内容。即除此之外的任何其他选择?

getDOM()

我只是想让解决方案像评论部分(这在这里不起作用)。

编辑:我只是想避免不必要的数据库调用。

提前致谢!

3 个答案:

答案 0 :(得分:3)

通常的技巧是懒洋洋地加载它们。您可以使用Lazy<T>,但双重检查的简单字段也适用:

static List<Foo> fetched;
static readonly object syncLock = new object(); // because: threading
public static List<Foo> Whatever {
    get {
        var tmp = fetched;
        if(tmp != null) return tmp;
        lock(syncLock) {
            tmp = fetched;
            if(tmp != null) return tmp; // double-checked lock
            return fetched = GetTheActualData();
        }
    }
}
private static List<Foo> GetTheActualData() {...}

其他想法:

  • 存储密码永远不是一个好主意
  • List<T>是可变的;如果要静态存储,则应确保人们无法更改列表或列表中的项目
  • 当数据库中的数据发生变化时,您会怎么做?它是如何更新的?

答案 1 :(得分:0)

使用Lazy,它是线程安全的。 Lazy

private Lazy<IEnumerable<User>> users = new Lazy<IEnumerable<User>>(Userlist);
public Lazy<IEnumerable<User>> Users
{
  get
  {
    return this.users;
  }
}

public static IEnumerable<User> Userlist()
{
    string strSQL = "";
    List<User> users = new List<User>();
    strSQL = "select USERID,USERNAME,PASSWORD from USERS";

    //if (Userlist().Count > 0)
    //{
    //    return Userlist();
    //}
    //else
    //{
    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
    {
        using (var command = new SqlCommand(strSQL, connection))
        {
            connection.Open();
            using (var dataReader = command.ExecuteReader())
            {
                while (dataReader.Read())
                {
                    users.Add(new User { Id = Convert.ToInt32(dataReader["USERID"]), user = dataReader["USERNAME"].ToString(), password = Decrypt(dataReader["PASSWORD"].ToString()), estatus = true, RememberMe = true });
                }
            }
        }
    }
    return users;
    // }
}

答案 2 :(得分:0)

您也可以使用caching

这个想法是,List<Users>将被缓存,并且当应用程序请求用户列表时,我们从缓存中返回它,并避免数据库命中。

示例实现可能是这样的。建议阅读有关缓存的更多信息,因为有许多方面需要注意,例如,当缓存过期时,如果在数据库中输入新用户,它将如何失效。

public List<User> Userlist()
        {
            ObjectCache cache = MemoryCache.Default;

            var users = cache["users"];

            if (users == null)
            {
                CacheItemPolicy policy = new CacheItemPolicy();

                //For dmonstration, I used cache expring after 1 day
                //Set the cache policy as per your need
                policy.AbsoluteExpiration = DateTime.Now.AddDays(1);


                // Fetch the users here from database
                List<User> userList = GetUsersFromDatabase();

                //Set the users in the cache
                cache.Set("users", userList, policy);

            }

            return cache["users"] as List<User>;
        }

        private static List<User> GetUsersFromDatabase()
        {
            string strSQL = "";
            List<User> users = new List<User>();
            strSQL = "select USERID,USERNAME,PASSWORD from USERS";

            //if (Userlist().Count > 0)
            //{
            //    return Userlist();
            //}
            //else
            //{
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))
            {
                using (var command = new SqlCommand(strSQL, connection))
                {
                    connection.Open();
                    using (var dataReader = command.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            users.Add(new User { Id = Convert.ToInt32(dataReader["USERID"]), user = dataReader["USERNAME"].ToString(), password = Decrypt(dataReader["PASSWORD"].ToString()), estatus = true, RememberMe = true });
                        }
                    }
                }
            }
            return users;
        }