Попытка создать 'класс SuperUser' с помощью ASPNET ProfileBase и MembershipUser - PullRequest
0 голосов
/ 19 февраля 2010

Я недавно установил 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

     }

}

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Код, похоже, вы планируете сделать много ненужной работы. И нет никаких веских причин объединять инфраструктуру членства и профилей в класс-оболочку, и есть много причин не делать этого.

Первая причина в том, что вы нигде не можете ее использовать. Вам придется построить собственную инфраструктуру. Я сделал это, и это не весело.

Что забавно, так это кодирование для установленного API и использование миллионов долларов и тысяч человеко-часов, потраченных на проектирование, разработку и тестирование систем ASP.NET на основе поставщиков.

Если вы хотите иметь пользовательского членства, первым делом нужно унаследовать от MembershipUser, чтобы вы могли легко реализовать пользовательский поставщик, который подключается прямо к инфраструктуре asp.net.

См. здесь для очень быстрого и легко усваиваемого примера и здесь для стандартных документов.

Что касается составления профиля внутри вашего пользователя. Членство, роли и профиль - это отдельные, но связанные аспекты инфраструктуры, которые были логически разделены для обеспечения максимальной гибкости и повторного использования.

Я уверен, что вы найдете большую ценность в том, чтобы научиться кодировать API-интерфейсы на основе провайдера и сосредоточиться на решении интересных задач, а не изобретать велосипед.

Удачи

1 голос
/ 19 февраля 2010

Вам нужно будет внедрить свой собственный Пользовательский членский состав , чтобы заполнить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...