成员类在我的自定义提供程序上调用“错误”方法?

时间:2011-02-08 22:37:34

标签: c# asp.net-mvc membership membership-provider

我开发了自己的自定义成员资格和角色提供程序。 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;
        }
    }

1 个答案:

答案 0 :(得分:0)

通过以这种方式进行转换以访问您的特定实例,您几乎完全绕过了Asp.Net Membership系统的要点。我们的想法是,系统使用已知的合同来管理其用户数据,当您必须以这种方式开始投射时,您就违反了合同。我很欣赏这可能是一个小小的改变,但从来没有这么一点“气味”。

此时你也可以运行自己的实现,因为实际上没有任何区别,但只需坚持使用你所拥有的东西就可以节省一些时间。

如果你想稍微清理一下,我会回到Asp.Net Membership让你重载的原始CreateUser方法,但是创建了一个围绕会员功能的包装器,它强制执行你需要通过的所有额外细节如果你不能这样做(也许是因为你使用Asp.Net附带的默认创建用户向导控件)那么我建议你的要求超出Asp.Net成员系统所需要的和你的需求。从长远来看,最好设计一个更适合你想要实现的系统。

祝你好运!