diff Demo/Asp.Net/BusinessLogic/ProfileProvider.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/ProfileProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,419 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Configuration;
+using System.Web.Profile;
+
+namespace PetShop.BusinessLogic
+{
+	using DataAccess;
+	using ObjectModel;
+
+	public sealed class ProfileProvider : System.Web.Profile.ProfileProvider
+	{
+		private static string _applicationName = ".NET Pet Shop 4.0";
+
+		/// <summary>
+		/// The name of the application using the custom profile provider.
+		/// </summary>
+		public override string ApplicationName
+		{
+			get { return _applicationName;  }
+			set { _applicationName = value; }
+		}
+
+		/// <summary>
+		/// Initializes the provider.
+		/// </summary>
+		/// <param name="name">The friendly name of the provider.</param>
+		/// <param name="config">A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider.</param>
+		public override void Initialize(string name, NameValueCollection config)
+		{
+			if (config == null)
+				throw new ArgumentNullException("config");
+
+			if (string.IsNullOrEmpty(config["description"]))
+			{
+				config.Remove("description");
+				config.Add("description", "Pet Shop Custom Profile Provider");
+			}
+
+			if (string.IsNullOrEmpty(name))
+				name = "PetShopProfileProvider";
+
+			if (config["applicationName"] != null && !string.IsNullOrEmpty(config["applicationName"].Trim()))
+				_applicationName = config["applicationName"];
+
+			base.Initialize(name, config);
+		}
+
+		private const string ERR_INVALID_PARAMETER = "Invalid Profile parameter:";
+		private const string PROFILE_SHOPPINGCART  = "ShoppingCart";
+		private const string PROFILE_WISHLIST      = "WishList";
+		private const string PROFILE_ACCOUNT       = "AccountInfo";
+
+		/// <summary>
+		/// Returns the collection of settings property values for the specified application instance and settings property group.
+		/// </summary>
+		/// <param name="context">A System.Configuration.SettingsContext describing the current application use.</param>
+		/// <param name="collection">A System.Configuration.SettingsPropertyCollection containing the settings property group whose values are to be retrieved.</param>
+		/// <returns>A System.Configuration.SettingsPropertyValueCollection containing the values for the specified settings property group.</returns>
+		public override SettingsPropertyValueCollection GetPropertyValues(
+			SettingsContext context, SettingsPropertyCollection collection)
+		{
+			string username        = (string)context["UserName"];
+			bool   isAuthenticated = (bool)  context["IsAuthenticated"];
+
+			SettingsPropertyValueCollection svc = new SettingsPropertyValueCollection();
+
+			foreach (SettingsProperty prop in collection)
+			{
+				SettingsPropertyValue pv = new SettingsPropertyValue(prop);
+
+				switch (pv.Property.Name)
+				{
+					case PROFILE_SHOPPINGCART: pv.PropertyValue = GetCartItems(username, true);  break;
+					case PROFILE_WISHLIST:     pv.PropertyValue = GetCartItems(username, false); break;
+					case PROFILE_ACCOUNT:
+						if (isAuthenticated)
+							pv.PropertyValue = GetAccountInfo(username);
+						break;
+
+					default:
+						throw new ApplicationException(ERR_INVALID_PARAMETER + " name.");
+				}
+
+				svc.Add(pv);
+			}
+
+			return svc;
+		}
+
+		/// <summary>
+		/// Sets the values of the specified group of property settings.
+		/// </summary>
+		/// <param name="context">A System.Configuration.SettingsContext describing the current application usage.</param>
+		/// <param name="collection">A System.Configuration.SettingsPropertyValueCollection representing the group of property settings to set.</param>
+		public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
+		{
+			string username = (string)context["UserName"];
+
+			CheckUserName(username);
+
+			bool isAuthenticated = (bool)context["IsAuthenticated"];
+			int  uniqueID        = GetUniqueID(username, isAuthenticated, false, ApplicationName);
+
+			foreach (SettingsPropertyValue pv in collection)
+			{
+				if (pv.PropertyValue != null)
+				{
+					switch (pv.Property.Name)
+					{
+						case PROFILE_SHOPPINGCART: SetCartItems(uniqueID, (Cart)pv.PropertyValue, true);  break;
+						case PROFILE_WISHLIST:     SetCartItems(uniqueID, (Cart)pv.PropertyValue, false); break;
+						case PROFILE_ACCOUNT:
+							if (isAuthenticated)
+								SetAccountInfo(uniqueID, (Address)pv.PropertyValue);
+							break;
+
+						default:
+							throw new ApplicationException(ERR_INVALID_PARAMETER + " name.");
+					}
+				}
+			}
+
+			UpdateActivityDates(username, false);
+		}
+
+		private int GetUniqueID(string userName, bool isAuthenticated, bool ignoreAuthenticationType, string appName)
+		{
+			int? uniqueID = ignoreAuthenticationType ?
+				Accessor.GetUniqueID    (userName, appName) :
+				Accessor.GetUniqueIDAuth(userName, appName, isAuthenticated);
+
+			return uniqueID ?? Accessor.CreateProfile(userName, appName, isAuthenticated);
+		}
+
+		private Address GetAccountInfo(string username)
+		{
+			return Accessor.GetAccountInfo(username, _applicationName);
+		}
+
+		private Cart GetCartItems(string username, bool isShoppingCart)
+		{
+			Cart cart = new Cart();
+
+			foreach (CartItem cartItem in Accessor.GetCartItems(username, _applicationName, isShoppingCart))
+				cart.Add(cartItem);
+
+			return cart;
+		}
+
+		private void SetAccountInfo(int uniqueID, Address address)
+		{
+			Accessor.SetAccountInfo(uniqueID, address);
+		}
+
+		private void SetCartItems(int uniqueID, Cart cart, bool isShoppingCart)
+		{
+			Accessor.SetCartItems(uniqueID, cart.Items, isShoppingCart);
+		}
+
+		// UpdateActivityDates
+		// Updates the LastActivityDate and LastUpdatedDate values 
+		// when profile properties are accessed by the
+		// GetPropertyValues and SetPropertyValues methods. 
+		// Passing true as the activityOnly parameter will update
+		// only the LastActivityDate.
+		private void UpdateActivityDates(string username, bool activityOnly)
+		{
+			if (activityOnly)
+				Accessor.UpdateActivityDate(username, _applicationName);
+			else
+				Accessor.UpdateActivityAndUdpateDates(username, _applicationName);
+		}
+
+		/// <summary>
+		/// Deletes profile properties and information for the supplied list of profiles.
+		/// </summary>
+		/// <param name="profiles">A System.Web.Profile.ProfileInfoCollection of information about profiles that are to be deleted.</param>
+		/// <returns>The number of profiles deleted from the data source.</returns>
+		public override int DeleteProfiles(ProfileInfoCollection profiles)
+		{
+			int deleteCount = 0;
+
+			foreach (ProfileInfo p in profiles)
+				if (DeleteProfile(p.UserName))
+					deleteCount++;
+
+			return deleteCount;
+		}
+
+		/// <summary>
+		/// Deletes profile properties and information for profiles that match the supplied list of user names.
+		/// </summary>
+		/// <param name="usernames">A string array of user names for profiles to be deleted.</param>
+		/// <returns>The number of profiles deleted from the data source.</returns>
+		public override int DeleteProfiles(string[] usernames)
+		{
+			int deleteCount = 0;
+
+			foreach (string user in usernames)
+				if (DeleteProfile(user))
+					deleteCount++;
+
+			return deleteCount;
+		}
+
+		// DeleteProfile
+		// Deletes profile data from the database for the specified user name.
+		private bool DeleteProfile(string username)
+		{
+			CheckUserName(username);
+
+			int? uniqueID = Accessor.GetUniqueID(username, _applicationName);
+
+			return uniqueID != null && Accessor.DeleteProfile(uniqueID.Value) > 0;
+		}
+
+		// Verifies user name for sise and comma
+		private static void CheckUserName(string userName)
+		{
+			if (string.IsNullOrEmpty(userName) || userName.Length > 256 || userName.IndexOf(",") > 0)
+				throw new ApplicationException(ERR_INVALID_PARAMETER + " user name.");
+		}
+
+		/// <summary>
+		/// Deletes all user-profile data for profiles in which the last activity date occurred before the specified date.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are deleted.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate value of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <returns>The number of profiles deleted from the data source.</returns>
+		public override int DeleteInactiveProfiles(ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
+		{
+			IList<string> list;
+
+			switch (authenticationOption)
+			{
+				case ProfileAuthenticationOption.Anonymous:
+					list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, true);
+					break;
+
+				case ProfileAuthenticationOption.Authenticated:
+					list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, false);
+					break;
+
+				default:
+					list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName);
+					break;
+			}
+
+			string[] userArray = new string[list.Count];
+
+			list.CopyTo(userArray, 0);
+
+			return DeleteProfiles(userArray);
+		}
+
+		/// <summary>
+		/// Retrieves profile information for profiles in which the user name matches the specified user names.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="usernameToMatch">The user name to search for.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information
+		///     for profiles where the user name matches the supplied usernameToMatch parameter.</returns>
+		public override ProfileInfoCollection FindProfilesByUserName(
+			ProfileAuthenticationOption authenticationOption, string usernameToMatch,
+			int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, usernameToMatch, null, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Retrieves profile information for profiles in which the last activity date occurred on or before the specified date and the user name matches the specified user name.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="usernameToMatch">The user name to search for.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate value of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user profile information for inactive profiles where the user name matches the supplied usernameToMatch parameter.</returns>	
+		public override ProfileInfoCollection FindInactiveProfilesByUserName(
+			ProfileAuthenticationOption authenticationOption, string usernameToMatch, DateTime userInactiveSinceDate,
+			int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, usernameToMatch, userInactiveSinceDate, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Retrieves user profile data for all profiles in the data source.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information for all profiles in the data source.</returns>		
+		public override ProfileInfoCollection GetAllProfiles(
+			ProfileAuthenticationOption authenticationOption, int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, null, null, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Retrieves user-profile data from the data source for profiles in which the last activity date occurred on or before the specified date.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information about the inactive profiles.</returns>
+		public override ProfileInfoCollection GetAllInactiveProfiles(
+			ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate,
+			int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, null, userInactiveSinceDate, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Returns the number of profiles in which the last activity date occurred on or before the specified date.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <returns>The number of profiles in which the last activity date occurred on or before the specified date.</returns>
+		public override int GetNumberOfInactiveProfiles(
+			ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
+		{
+			int inactiveProfiles = 0;
+
+			ProfileInfoCollection profiles = GetProfileInfo(authenticationOption, null, userInactiveSinceDate, 0, 0, out inactiveProfiles);
+
+			return inactiveProfiles;
+		}
+
+		private static void CheckParameters(int pageIndex, int pageSize)
+		{
+			if (pageIndex < 1 || pageSize < 1)
+				throw new ApplicationException(ERR_INVALID_PARAMETER + " page index.");
+		}
+
+		// GetProfileInfo
+		// Retrieves a count of profiles and creates a 
+		// ProfileInfoCollection from the profile data in the 
+		// database. Called by GetAllProfiles, GetAllInactiveProfiles,
+		// FindProfilesByUserName, FindInactiveProfilesByUserName, 
+		// and GetNumberOfInactiveProfiles.
+		// Specifying a pageIndex of 0 retrieves a count of the results only.
+		private ProfileInfoCollection GetProfileInfo(
+			ProfileAuthenticationOption authenticationOption,
+			string    usernameToMatch,
+			DateTime? userInactiveSinceDate,
+			int       pageIndex,
+			int       pageSize,
+			out int   totalRecords)
+		{
+			totalRecords = 0;
+
+			ProfileInfoCollection profiles = new ProfileInfoCollection();
+
+			// Count profiles only.
+			if (pageSize == 0)
+				return profiles;
+
+			int counter    = 0;
+			int startIndex = pageSize * (pageIndex - 1);
+			int endIndex   = startIndex + pageSize - 1;
+
+			bool? isAnonymous = null;
+
+			if (authenticationOption == ProfileAuthenticationOption.Anonymous)
+				isAnonymous = true;
+			else if (authenticationOption == ProfileAuthenticationOption.Authenticated)
+				isAnonymous = false;
+
+			foreach (CustomProfile profile in Accessor.GetProfile(
+				isAnonymous, usernameToMatch, userInactiveSinceDate, _applicationName, out totalRecords))
+			{
+				if (counter >= startIndex)
+				{
+					ProfileInfo p = new ProfileInfo(
+						profile.UserName,
+						profile.IsAnonymous ?? true,
+						profile.LastActivityDate ?? DateTime.MinValue,
+						profile.LastUpdatedDate  ?? DateTime.MinValue, 0);
+
+					profiles.Add(p);
+				}
+
+				if (counter >= endIndex)
+					break;
+
+				counter++;
+			}
+
+			return profiles;
+		}
+
+		#region Accessor
+
+		ProfileAccessor Accessor
+		{
+			[System.Diagnostics.DebuggerStepThrough]
+			get { return ProfileAccessor.CreateInstance(); }
+		}
+
+		#endregion
+	}
+}