向自定义asp.net会员供应商提供自定义数据库功能

问题描述:

我正在为我的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实例传递给此类,以便我可以访问这些方法。

任何人都可以提供解决方案。可能有一些更好的技术我不知道。我正在使用的方法可能是错误的。你的建议总是受欢迎的。

感谢您分享宝贵的时间。

了解成员资格提供程序的生命周期将有助于解决此问题。

会员提供的一个实例是启动状态时,应用程序启动并保持为 应用 AppDomain中的生命周期,这实际上等同于应用程序生命周期活跃。例如如果出于某种原因AppDomain循环,应用程序将被释放,并且新实例将启动。第一次使用时,会注册一个新的注册会员供应商实例。

你需要或者内您的会员提供者实现或访问静态方法从您的供应商中实例化你的数据访问类一个实例。我更喜欢使用一个实例。

通过创建单身人士或将其存储在应用程序中将成员资格提供者与其数据访问分开,这在我看来是一种破绽,并且会导致同伴中的痛苦,悲伤,失眠和信誉。

干杯和祝你好运。

不会在会话中保留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