首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试用ASPNET、SuperUser、ProfileBase和MembershipUser创建“MembershipUser类”

尝试用ASPNET、SuperUser、ProfileBase和MembershipUser创建“MembershipUser类”
EN

Stack Overflow用户
提问于 2010-02-18 21:12:27
回答 2查看 1.7K关注 0票数 0

我最近安装了aspnetdb,并为我的应用程序设计定制了它。我扩展了ASPNET提供者,作为我的类设计的一部分: MyMembershipProvider、MyProfileProvider和MyRoleProvider。那里一切都很好。

现在,根据我的系统的要求,我需要添加自定义数据,并且我不想使用aspnet_Profile中提供的名称/值设计。因此,我创建了两个自定义表:

dbo.Profile

代码语言:javascript
复制
CREATE TABLE [dbo].[Profiles](
    [profileid] [int] IDENTITY(1,1) NOT NULL,
    [userid] [uniqueidentifier] NOT NULL,
    [username] [varchar](255) COLLATE Latin1_General_CI_AI NOT NULL,
    [applicationname] [varchar](255) COLLATE Latin1_General_CI_AI NOT NULL,
    [confirmcode] [varchar](255) COLLATE Latin1_General_CI_AI NOT NULL,
    [isanonymous] [bit] NULL,
    [lastactivity] [datetime] NULL,
    [lastupdated] [datetime] NULL,
 CONSTRAINT [PK__Profiles__1DB06A4F] PRIMARY KEY CLUSTERED 
(
    [profileid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY],
 CONSTRAINT [PKProfiles] UNIQUE NONCLUSTERED 
(
    [username] ASC,
    [applicationname] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

dbo.ProfileData

代码语言:javascript
复制
CREATE TABLE [dbo].[ProfileData](
    [profiledataid] [int] IDENTITY(1,1) NOT NULL,
    [profileid] [int] NOT NULL,
    [lastname] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [firstname] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [alternateemail] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [zipcode] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [birthmonth] [tinyint] NULL,
    [birthday] [tinyint] NULL,
    [birthyear] [int] NULL,
    [gender] [varchar](10) COLLATE Latin1_General_CI_AI NULL,
    [city] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [state] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [country] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [ipaddress] [varchar](50) COLLATE Latin1_General_CI_AI NULL,
    [sessionid] [bigint] NULL,
 CONSTRAINT [PK_ProfileData] PRIMARY KEY CLUSTERED 
(
    [profiledataid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

现在,由于我有扩展ASPNET基础结构的自定义数据,我编写了一个自定义用户类,帮助扩展该数据作为概要文件快照的一部分。我基本上遵循了约翰·加洛韦在这个博客中的建议

代码语言:javascript
复制
public class CustomUser : ProfileBase
{

        public customuser() {}

         public static CustomUser GetCustomUserProfile(string username)
        {
            return System.Web.Profile.ProfileBase.Create(username) as CustomUser;
        }

        #region ProfileBase Extended Properties

        [SettingsAllowAnonymous(false), CustomProviderData("FirstName;string")]
        public string FirstName { get { return base["FirstName"] as string; } set { base["FirstName"] = value; } }

        [SettingsAllowAnonymous(false), CustomProviderData("LastName;string")]
        public string LastName { get { return base["LastName"] as string; } set { base["LastName"] = value; } }

        [SettingsAllowAnonymous(false), CustomProviderData("AlternateEmail;string")]
        public string AlternateEmail { get { return base["AlternateEmail"] as string; } set { base["AlternateEmail"] = value; } }

       // AND SO ON...

        #endregion

}

好吧,到目前为止还不错。我有一个CustomUser类,可以用来获取和设置概要数据:

CustomUser _cu =CustomUser.GetUserProfile(用户名);

这将返回除从ProfileBase继承的属性之外的所有自定义字段。太棒了。

但是,如果我想将其他属性添加到用户的配置文件中呢?即ASPNET的MembershipUser类如IsOnline、PasswordQuestion、IsLockedOut等提供的.要从MembershipUser获得基本属性,我可以尝试如下:

代码语言:javascript
复制
public class CustomUser : MembershipUser
    {
        public CustomUser(string providerName, string name, object providerUserKey, string email,
                                string passwordQuestion, string comment, bool isApproved, bool isLockedOut,
                                DateTime creationDate, DateTime lastLoginDate, DateTime lastActivityDate,
                                DateTime lastPasswordChangedDate, DateTime lastLockoutDate)
            : base(
                providerName, name, providerUserKey, email, passwordQuestion, comment, isApproved, isLockedOut,
                creationDate, lastLoginDate, lastActivityDate, lastPasswordChangedDate, lastLockoutDate)
        {
        }

        protected CustomUser()
        {
        }

        // e.g. no desire to use Profile, can just add data
        // say, from a flat record containing all user data
        public string MyCustomField { get; set; }
    }

但是,由于我也一直在继承ProfileBase,而C#不允许多重继承(也就是说,我不能做CustomUser: ProfileBase,MembershipUser),所以我遇到了一些问题。构建我的用户类的最佳方法是什么,以便user _user = new ();返回与经过身份验证的用户相关的全部属性?

下面是我第一次尝试这个"SuperUser“类,但我很难弄清楚如何创建类对象的新实例,以便同时创建CustomUser和MembershipUser。

我这样做对吗?

代码语言:javascript
复制
    public class User
    {

        public User() { }

        public static User GetUserProfile(string username)
        {
             // return combined profile based on username
        }

        #region CustomUser Members

        private CustomUser _customUser
        {
            get
            {       
                if (UserName != null)
                {
                    try
                    {
                        return ProfileBase.Create(UserName) as CustomUser;
                    }
                    catch { return null;  }
                }
                else
                {
                    try 
                    {
                        // this will work if the site user is log'd in
                        return ProfileBase.Create(Membership.GetUser().UserName) as CustomUser;
                    }
                    catch { return null;  }
                }

            }
        }

        public string FirstName
        {
            get
            {
                if (_customUser != null)
                {
                    return _customUser.FirstName;
                }
                return string.Empty;
            }

            set
            {
                if (_customUser != null)
                {
                    _customUser.FirstName = value;
                }
            }
        }

        public string LastName
        {
            get
            {
                if (_customUser != null)
                {
                    return _customUser.LastName;
                }
                return string.Empty;
            }

            set
            {
                if (_customUser != null)
                {
                    _customUser.LastName = value;
                }
            }
        }


        #endregion

        #region MembershipUser Members

        //corresponding MembershipUser
        private MembershipUser _membershipUser
        {
            get
            {
                if (UserName != null)
                {
                    return Membership.GetUser(UserName);
                }
                return null;
            }
        }

        //Properties looked up from MembershipUser

        public string UserName
        {
            get
            {
                if (_membershipUser != null)
                {
                    return _membershipUser.UserName;
                }
                return string.Empty;
            }

        }

        public string Email
        {
            get
            {
                if (_membershipUser != null)
                {
                    return _membershipUser.Email;
                }
                return string.Empty;
            }

        }

        public object ProviderUserKey
        {
            get
            {
                if (_membershipUser != null)
                {
                    return _membershipUser.ProviderUserKey;
                }
                return null;
            }
        }


        #endregion

     }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-19 01:10:14

代码,看起来您正在计划做许多不必要的工作。没有令人信服的理由将成员和概要文件基础结构聚合到包装类中,并且有许多理由不这样做。

第一个原因是你不能在任何地方使用它。你必须建立你自己的基础设施。我做过这件事,但这并不有趣。

有趣的是对一个已建立的api进行编码,并利用数百万美元和数千个工时来设计、开发和测试基于提供商的ASP.NET系统。

如果您希望有一个自定义成员资格用户,那么第一步就是从MembershipUser继承,以便您可以轻松地实现一个插入到asp.net框架中的定制提供程序。

请参阅这里获取一个非常快速且易于理解的示例,并查看标准文档的这里

至于在您的用户中编写配置文件。成员资格、角色和配置文件是基础结构的独立但相关的方面,它们在逻辑上被分离,以最大限度地提高灵活性和重用性。

我相信,你会发现,学习编写代码给基于api的提供者,并专注于解决有趣的问题,而不是重新发明轮子,会发现更多的价值。

祝好运

票数 1
EN

Stack Overflow用户

发布于 2010-02-18 21:34:12

您还必须实现自己的自定义成员资格提供程序来填充它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2292219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档