我开发了自己的自定义成员资格和角色提供程序。 System.Web.Security.Membership类调用我尚未实现的CreateUser方法(故意,我想在MembershipUser中获取更多信息)。
在这种情况下我应该使用Membership类吗?
现在我强制要求我自己的会员提供商使用我实现的CreateUser方法,这是要走的路吗?我觉得有点迷茫,我该怎么办呢?
((MyMembershipProviderBase)Membership.Provider).CreateUser(username, password, email, lastName, firstName, phoneNumber, out status);
会员提供商CreateUser-methods:
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
throw new NotImplementedException();
}
public MyMembershipUser CreateUser(
string username, string password, string email, string lastName, string firstName,
string phoneNumber, out MembershipCreateStatus status)
{
// implemented...
}
*编辑
响应@elkdanger评论。
这是你在评论中提到的那种包装吗?
现在,Membership类调用重定向到我自己的实现的标准CreateUser方法,问题是我无法为用户设置附加信息(firstname,lastename和phonenumber)。这是一种方法,然后处理从其他地方设置附加信息(我在哪里创建我的用户)?
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion,
string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
return this.CreateUser(username, password, email, "", "", "", out status);
}
public MyMembershipUser CreateUser(
string username, string password, string email, string lastName, string firstName,
string phoneNumber, out MembershipCreateStatus status
)
{
var args =
new ValidatePasswordEventArgs(username, password, true);
OnValidatingPassword(args);
if (args.Cancel)
{
status = MembershipCreateStatus.InvalidPassword;
return null;
}
if (RequiresUniqueEmail && GetUserNameByEmail(email) != "")
{
status = MembershipCreateStatus.DuplicateEmail;
return null;
}
MembershipUser u = GetUser(username, false);
if (u == null)
{
try
{
status = Repository.CreateUser(username, EncodePassword(password), email, lastName, firstName,
phoneNumber);
}
catch
{
status = MembershipCreateStatus.ProviderError;
}
return (MyMembershipUser)GetUser(username, false);
}
else
{
status = MembershipCreateStatus.DuplicateUserName;
return null;
}
}
答案 0 :(得分:0)
通过以这种方式进行转换以访问您的特定实例,您几乎完全绕过了Asp.Net Membership系统的要点。我们的想法是,系统使用已知的合同来管理其用户数据,当您必须以这种方式开始投射时,您就违反了合同。我很欣赏这可能是一个小小的改变,但从来没有这么一点“气味”。
此时你也可以运行自己的实现,因为实际上没有任何区别,但只需坚持使用你所拥有的东西就可以节省一些时间。
如果你想稍微清理一下,我会回到Asp.Net Membership让你重载的原始CreateUser方法,但是创建了一个围绕会员功能的包装器,它强制执行你需要通过的所有额外细节如果你不能这样做(也许是因为你使用Asp.Net附带的默认创建用户向导控件)那么我建议你的要求超出Asp.Net成员系统所需要的和你的需求。从长远来看,最好设计一个更适合你想要实现的系统。
祝你好运!