[英]Providing custom database functionality to custom asp.net membership provider
我正在为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实例传递给此类,以便我可以访问这些方法。
任何人都可以提供解决方案。 可能有一些我不了解的更好的技术。 我使用的方法可能是错的。 您的建议随时欢迎。
感谢您分享宝贵的时间。
了解成员资格提供者的生命周期有助于澄清这一点。
成员资格提供程序的实例在应用程序启动时启动,并在
应用程序
AppDomain的生命周期内保持活动状态,这实际上等同于应用程序生命周期。 例如,如果由于某种原因AppDomain循环,则处理该应用程序并启动新实例。 注册会员提供商的新实例将在首次使用时启动。
您需要或者您的会员提供者实现或访问静态方法中从您的提供商中实例化你的数据访问类的一个实例。 我更喜欢使用实例。
通过创建单身人士或将其存储在应用程序中来将成员资格提供者与其数据访问分开是我认为的一个黑客行为,除了痛苦,悲伤,失眠以及同行之间的信誉之外别无他法。
干杯,祝你好运。
不要在会话中保留DBConnect类的单独实例,最终将为每个用户创建一个类! 这将严重影响可扩展性。
您可以执行以下操作之一:
我的建议是去3号。你通常不需要创建一个执行数据库crud操作的类的实例,例如
public static class DBConnect
{
public static ChangePassword(string userId, string password)
{
//Implementation here
}
}
然后,您只需在提供程序中调用此代码,而无需创建实例:
DBConnect.ChangePassword(x,y);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.