Я недавно установил 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, я написал пользовательский класс, который помогает расширять эти данные как часть снимка профиля.Я в основном следовал советам Джона Галлоуэя в этом блоге
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, я мог бы попробовать что-то вроде:
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 ();возвращает полный набор свойств, имеющих отношение к аутентифицированному пользователю?
Ниже мой первый удар по этому классу «SuperUser», но мне очень трудно понять, как создать новый экземпляр объекта класса, чтобы были созданы и 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
}
}