我正在为我的asp.net应用程序创建自定义成员资格提供程序。我还创建了一个单独的类“DBConnect”,它提供数据库功能,例如执行SQL语句,执行SP,执行SP或查询以及返回SqlDataReader等等......
我在Global.asax的Session_Start中创建了DBConnect类的实例并存储到会话中。后来使用静态类我在整个应用程序中使用相同的单个会话提供数据库功能。简而言之,我从任何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实例传递给这个类,以便我可以访问这些方法。
任何人都可以为此提供解决方案。可能有一些我不了解的更好的技术。我使用的方法可能是错的。您的建议随时欢迎。
感谢您分享宝贵的时间。
答案 0 :(得分:4)
了解会员提供商的生命周期有助于明确这一点。
成员资格提供程序的实例在应用程序启动时启动,并在应用程序 AppDomain的生命周期内保持活动状态,这实际上等同于应用程序生命周期。例如如果由于某种原因AppDomain循环,则会处理该应用程序并启动新实例。注册会员提供商的新实例将在首次使用时启动。
您需要在成员资格提供程序实现中实例化数据访问类的实例,或者从提供程序中 中访问静态方法。我更喜欢使用实例。
通过创建单身人士或将其存储在应用程序中来将成员资格提供者与其数据访问分开是我认为的一个黑客行为,除了痛苦,悲伤,失眠以及同行之间的信誉之外别无他法。
干杯,祝你好运。
答案 1 :(得分:3)
不要在会话中保留DBConnect类的单独实例,最终会为每个用户创建一个类!这将严重影响可扩展性。
您可以执行以下操作之一:
我的建议是去3号。你通常不需要创建一个做数据库crud操作的类的实例,例如
public static class DBConnect
{
public static ChangePassword(string userId, string password)
{
//Implementation here
}
}
然后,您只需在提供程序中调用此代码,而无需创建实例:
DBConnect.ChangePassword(x,y);