2010-04-14 111 views
5

我正在爲我的asp.net應用程序創建自定義會員供應商。我還創建了一個單獨的類「DBConnect」,它提供了數據庫功能,如執行SQL語句,執行SP,執行SP或查詢並返回SqlDataReader等...向自定義asp.net會員供應商提供自定義數據庫功能

我在Session_Start中創建了DBConnect類的實例Global.asax並存儲到會話中。後來使用靜態類我使用相同的單個會話在整個應用程序中提供數據庫功能。總之,我爲任何asp.net頁面的所有數據庫操作提供單點。

我知道我可以編寫自己的代碼來連接/斷開數據庫,並從我需要覆蓋的方法中執行SP。請看下面的代碼 -

public class SGI_MembershipProvider : MembershipProvider 
{ 

......

public override bool ChangePassword(string username, string oldPassword, string newPassword) 
    { 
     if (!ValidateUser(username, oldPassword)) 
      return false; 

     ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true); 

     OnValidatingPassword(args); 

     if (args.Cancel) 
     { 
      if (args.FailureInformation != null) 
      { 
       throw args.FailureInformation; 
      } 
      else 
      { 
       throw new Exception("Change password canceled due to new password validation failure."); 
      } 
     } 

.....   

//Database connectivity and code execution to change password. 

} 

.... 

} 

我的問題 - 現在我需要的是來自同一個數據庫中的所有這些重寫的方法內執行數據庫部分如頂部所述。那就是我必須將會話中存在的DBConnect實例傳遞給此類,以便我可以訪問這些方法。

任何人都可以提供解決方案。可能有一些更好的技術我不知道。我正在使用的方法可能是錯誤的。你的建議總是受歡迎的。

感謝您分享寶貴的時間。

回答

4

瞭解成員資格提供程序的生命週期將有助於解決此問題。

會員提供的一個實例是啓動狀態時,應用程序啓動並保持爲 應用 AppDomain中的生命週期,這實際上等同於應用程序生命週期活躍。例如如果出於某種原因AppDomain循環,應用程序將被釋放,並且新實例將啓動。第一次使用時,會註冊一個新的註冊會員供應商實例。

你需要或者內您的會員提供者實現或訪問靜態方法從您的供應商中實例化你的數據訪問類一個實例。我更喜歡使用一個實例。

通過創建單身人士或將其存儲在應用程序中將成員資格提供者與其數據訪問分開,這在我看來是一種破綻,並且會導致同伴中的痛苦,悲傷,失眠和信譽。

乾杯和祝你好運。

3

不會在會話中保留DBConnect類的單獨實例,您將最終爲每個用戶創建一個類!這將嚴重影響可伸縮性。

您可以執行下列操作之一:

  • 放置類應用程序狀態
  • 使用singleton pattern
  • 使類,並在類的靜態的所有方法。

我的建議是去數3,不經常需要創建的類,它的數據庫CRUD操作,例如

public static class DBConnect 
{ 
    public static ChangePassword(string userId, string password) 
    { 
    //Implementation here 
    } 
} 

然後,你可以簡單地調用您的提供商的代碼沒有實例創建實例:

DBConnect.ChangePassword(x,y); 
+0

謝謝詹姆斯!對於數據庫功能,我不完全一樣。但是,作爲DBConnect的成員而不是ChangePassword(),我需要執行一小部分,如 SqlParameter [] p = new SqlParameter [3]; p [0] =新的SqlParameter(「@ applicationName」,applicationName); p [1] =新的SqlParameter(「@ username」,username); p [2] =新的SqlParameter(「@密碼」,EncodePassword(newPassword)); bool retval = dbConn.ExecuteSP(「User_ChangePassword」,p); 從我的MembershipProvider類。 – IrfanRaza 2010-04-14 09:29:24

+0

該代碼必須在db連接中進行,sql參數的值必須作爲靜態函數的參數傳遞。別擔心,所有的東西都會在同一個過程中運行,並且連接會被ado.net合併。 – 2010-04-14 09:59:51

相關問題