C# 成员类将;“错误”;我的自定义提供程序上的方法?

C# 成员类将;“错误”;我的自定义提供程序上的方法?,c#,asp.net-mvc,membership,membership-provider,C#,Asp.net Mvc,Membership,Membership Provider,我已经开发了自己的自定义成员资格和角色提供程序。System.Web.Security.Membership类调用我尚未实现的CreateUser方法(我有意在MembershipUser中获取更多信息) 在这种情况下,我是否应该使用Membership类 现在,我向我自己的成员资格提供者进行类型转换,以使用我实现的CreateUser方法,这是正确的方法吗?我觉得有点失落,我该怎么处理 ((MyMembershipProviderBase)Membership.Provider).Create

我已经开发了自己的自定义成员资格和角色提供程序。System.Web.Security.Membership类调用我尚未实现的CreateUser方法(我有意在MembershipUser中获取更多信息)

在这种情况下,我是否应该使用Membership类

现在,我向我自己的成员资格提供者进行类型转换,以使用我实现的CreateUser方法,这是正确的方法吗?我觉得有点失落,我该怎么处理

((MyMembershipProviderBase)Membership.Provider).CreateUser(username, password, email, lastName, firstName, phoneNumber, out status);
成员资格提供程序CreateUser方法:

    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)。这就是从其他地方(我创建用户的地方)设置附加信息的方法吗


通过以这种方式强制转换以访问特定实例,您几乎完全绕过了Asp.Net成员资格系统。其思想是,该系统使用一个已知的契约来管理其用户数据,当您必须以这种方式开始强制转换时,您就违反了该契约。我很感激这可能是一个小小的改变,但它总是有点“味道”

在这一点上,您最好运行自己的实现,因为实际上不会有什么区别,但只要坚持使用现有的实现,就可以节省一些时间

如果您想稍微清理一下,我将返回到Asp.Net成员资格提供给您的原始CreateUser方法,以便重载,但在成员资格功能周围创建一个包装器,它强制执行您需要传递的所有额外细节。如果您不能做到这一点(可能是因为您使用的是Asp.Net附带的默认创建用户向导控件),那么我建议您的需求超出Asp.Net成员资格系统的要求,从长远来看,您最好设计自己的系统,使其更适合您所要实现的目标


祝你好运

谢谢你的评论!我不知道我是否完全理解您建议的包装器应该如何实现,但我尝试了一下,并更新了上面的帖子。我没有使用创建向导控件,我从一个新的MVC解决方案开始,并以自己的方式实现了提供程序。目标是能够使用内置的用户和角色功能,但可以控制如何以及哪些用户信息(和角色)存储到数据库中。
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;
        }
    }