2011-02-08 19 views
1

我開發了自己的自定義會員和角色提供者。 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... 
    } 

*編輯

Respons到@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

通過以這種方式來訪問您的特定實例,您幾乎完全繞過了Asp.Net Membership系統的要點。這個想法是,該系統與管理其用戶數據的已知合同一起工作,並且當您必須以這種方式開始投射時,您違反了該合同。我很欣賞這可能是一個小小的變化,但絕不少於它的「味道」。

在這一點上,你可能會運行你自己的實現,因爲它們之間沒有什麼區別,但是你只需堅持你擁有的東西就可以節省一些時間。

如果你想清理一下,我會回到Asp.Net Membership給你重載的最初的CreateUser方法,但是創建一個包含成員函數的包裝器,它會強制你需要的所有額外的細節如果你不能這樣做(可能是因爲你正在使用Asp.Net附帶的默認創建用戶嚮導控件),那麼我會建議你的要求 - 增加Asp.Net會員系統爲你提供的服務和你從長遠來看,設計自己的系統更適合你試圖實現的目標。

祝你好運!

+0

感謝您的評論!我不知道我是否完全理解你的建議應該如何實施,但我試了一下,並在上面更新了我的帖子。 – user579089 2011-02-11 11:50:44

相關問題