2016-05-30 36 views
0

我們是否可以防止在應用程序中多次加載以下內容。即除此之外的其他選擇嗎?訪問修飾符 - 只能加載一次

public IEnumerable<User> users() 
{ 
    var users = Userlist(); 
    return users.ToList(); 
} 

public static List<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; 
    // } 
} 

我只是想解決像評論部分(這並不在這裏工作)。

編輯:我只是想避免不必要的數據庫調用。

在此先感謝!

+1

你將不得不存儲您的列表中的內容在您的應用程序中的某個位置,否則您要檢查的列表將始終爲空。您可以在類中使用靜態字段,因此您的靜態方法將訪問該靜態字段,因此信息僅存儲一次。 – Adwaenyth

+1

''從用戶名中選擇用戶名,用戶名,密碼「'向我的靈魂核心發送寒冷的寒戰;我們(集體程序員社區)沒有學會永遠不會存儲密碼嗎? –

+0

@MarcGravell那麼它可能(我希望)存儲在那裏的鹽漬密碼散列,並且這個列表實際上用於認證用戶。否則是的,它是那些神聖的時刻之一。 – Adwaenyth

回答

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

謝謝。這只是一個示例代碼。有沒有關於管理密碼的文章,以便我可以清楚地瞭解? – SSJGSS

+0

@Ruban。J是這樣的嗎? https://crackstation.net/hashing-security.htm –

+1

我在存儲之前加密密碼:) ** Decrypt(dataReader [「PASSWORD」]。ToString())** – SSJGSS

0

使用懶惰,它是線程安全的。 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; 
    // } 
} 
+1

它給了我一個這樣的錯誤 '((=)=> Userlist)' - 無法將lambda表達式轉換爲類型'bool',因爲它不是委託類型。 – SSJGSS

+0

@ Ruban.J更新了答案,現在應該可以。考慮進行初始化異步,因爲現在第一個調用會阻止調用線程,同時它正在從db中加載用戶。 –

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; 
     }