我最近安装了aspnetdb并且已经进行了自定义 它是出于我的应用程序设计的目的。我已经扩展了ASPNET 提供者作为我的课程设计的一部分:MyMembershipProvider,MyProfileProvider, 和MyRoleProvider。一切都很好。
现在,根据我的系统需求,我需要添加自定义数据,但事实并非如此 想要使用aspnet_Profile中提供的名称/值设计。所以我有 创建了两个自定义表:
dbo.Profile
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
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基础设施,我有 编写了一个自定义用户类,有助于将该数据扩展为配置文件的一部分 快照。我基本上遵循了约翰加洛韦在this blog
中提出的建议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(username);
除了从中继承的属性外,这将返回我的所有自定义字段 ProfileBase。大。
但是如果我想在User的个人资料中添加其他属性呢?即,提供的那些 通过ASPNET的MembershipUser类,如IsOnline,PasswordQuestion,IsLockedOut等...... 要从MembershipUser获取基本属性,我可以尝试类似:
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 User();返回与经过身份验证的用户相关的全部属性?
以下是我对这个“超级用户”课程的第一次尝试,但我真的很难过 弄清楚如何创建类对象的新实例,以便同时使用CustomUser 和MembershipUser已创建。
我是以正确的方式来做这件事的吗?
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
}
}
答案 0 :(得分:1)
您还必须实施自己的Custom Membership Provider来填充它。
答案 1 :(得分:1)
代码,看起来你打算做很多不必要的工作。 没有令人信服的理由在包装类中聚合成员资格和配置文件基础结构,并且有很多理由不这样做。
第一个原因是你无法在任何地方使用它。您必须构建自己的基础架构。我做到了,它很有趣。
有趣的是编写成熟的api并利用数百万美元和数千小时的时间来设计,开发和测试基于提供程序的ASP.NET系统。
如果您希望拥有自定义成员资格用户,则第一步是继承MembershipUser,以便您可以轻松实现直接插入asp.net框架的自定义提供程序。
请参阅 here 以获取非常快速且易于理解的示例,并使用 here 获取标准文档。
至于在您的用户中撰写个人资料。成员资格,角色和个人资料是基础设施的独立但相关的方面,并且在逻辑上是分开的,以最大限度地提高灵活性和重用。
我确信你会发现更多的价值在学习编码到基于提供者的api,并专注于解决有趣的问题,而不是重新发明轮子。
祝你好运