Mercurial > pub > bltoolkit
comparison Demo/Asp.Net/BusinessLogic/ProfileProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin |
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f990fcb411a9 |
|---|---|
| 1 using System; | |
| 2 using System.Collections.Generic; | |
| 3 using System.Collections.Specialized; | |
| 4 using System.Configuration; | |
| 5 using System.Web.Profile; | |
| 6 | |
| 7 namespace PetShop.BusinessLogic | |
| 8 { | |
| 9 using DataAccess; | |
| 10 using ObjectModel; | |
| 11 | |
| 12 public sealed class ProfileProvider : System.Web.Profile.ProfileProvider | |
| 13 { | |
| 14 private static string _applicationName = ".NET Pet Shop 4.0"; | |
| 15 | |
| 16 /// <summary> | |
| 17 /// The name of the application using the custom profile provider. | |
| 18 /// </summary> | |
| 19 public override string ApplicationName | |
| 20 { | |
| 21 get { return _applicationName; } | |
| 22 set { _applicationName = value; } | |
| 23 } | |
| 24 | |
| 25 /// <summary> | |
| 26 /// Initializes the provider. | |
| 27 /// </summary> | |
| 28 /// <param name="name">The friendly name of the provider.</param> | |
| 29 /// <param name="config">A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider.</param> | |
| 30 public override void Initialize(string name, NameValueCollection config) | |
| 31 { | |
| 32 if (config == null) | |
| 33 throw new ArgumentNullException("config"); | |
| 34 | |
| 35 if (string.IsNullOrEmpty(config["description"])) | |
| 36 { | |
| 37 config.Remove("description"); | |
| 38 config.Add("description", "Pet Shop Custom Profile Provider"); | |
| 39 } | |
| 40 | |
| 41 if (string.IsNullOrEmpty(name)) | |
| 42 name = "PetShopProfileProvider"; | |
| 43 | |
| 44 if (config["applicationName"] != null && !string.IsNullOrEmpty(config["applicationName"].Trim())) | |
| 45 _applicationName = config["applicationName"]; | |
| 46 | |
| 47 base.Initialize(name, config); | |
| 48 } | |
| 49 | |
| 50 private const string ERR_INVALID_PARAMETER = "Invalid Profile parameter:"; | |
| 51 private const string PROFILE_SHOPPINGCART = "ShoppingCart"; | |
| 52 private const string PROFILE_WISHLIST = "WishList"; | |
| 53 private const string PROFILE_ACCOUNT = "AccountInfo"; | |
| 54 | |
| 55 /// <summary> | |
| 56 /// Returns the collection of settings property values for the specified application instance and settings property group. | |
| 57 /// </summary> | |
| 58 /// <param name="context">A System.Configuration.SettingsContext describing the current application use.</param> | |
| 59 /// <param name="collection">A System.Configuration.SettingsPropertyCollection containing the settings property group whose values are to be retrieved.</param> | |
| 60 /// <returns>A System.Configuration.SettingsPropertyValueCollection containing the values for the specified settings property group.</returns> | |
| 61 public override SettingsPropertyValueCollection GetPropertyValues( | |
| 62 SettingsContext context, SettingsPropertyCollection collection) | |
| 63 { | |
| 64 string username = (string)context["UserName"]; | |
| 65 bool isAuthenticated = (bool) context["IsAuthenticated"]; | |
| 66 | |
| 67 SettingsPropertyValueCollection svc = new SettingsPropertyValueCollection(); | |
| 68 | |
| 69 foreach (SettingsProperty prop in collection) | |
| 70 { | |
| 71 SettingsPropertyValue pv = new SettingsPropertyValue(prop); | |
| 72 | |
| 73 switch (pv.Property.Name) | |
| 74 { | |
| 75 case PROFILE_SHOPPINGCART: pv.PropertyValue = GetCartItems(username, true); break; | |
| 76 case PROFILE_WISHLIST: pv.PropertyValue = GetCartItems(username, false); break; | |
| 77 case PROFILE_ACCOUNT: | |
| 78 if (isAuthenticated) | |
| 79 pv.PropertyValue = GetAccountInfo(username); | |
| 80 break; | |
| 81 | |
| 82 default: | |
| 83 throw new ApplicationException(ERR_INVALID_PARAMETER + " name."); | |
| 84 } | |
| 85 | |
| 86 svc.Add(pv); | |
| 87 } | |
| 88 | |
| 89 return svc; | |
| 90 } | |
| 91 | |
| 92 /// <summary> | |
| 93 /// Sets the values of the specified group of property settings. | |
| 94 /// </summary> | |
| 95 /// <param name="context">A System.Configuration.SettingsContext describing the current application usage.</param> | |
| 96 /// <param name="collection">A System.Configuration.SettingsPropertyValueCollection representing the group of property settings to set.</param> | |
| 97 public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection) | |
| 98 { | |
| 99 string username = (string)context["UserName"]; | |
| 100 | |
| 101 CheckUserName(username); | |
| 102 | |
| 103 bool isAuthenticated = (bool)context["IsAuthenticated"]; | |
| 104 int uniqueID = GetUniqueID(username, isAuthenticated, false, ApplicationName); | |
| 105 | |
| 106 foreach (SettingsPropertyValue pv in collection) | |
| 107 { | |
| 108 if (pv.PropertyValue != null) | |
| 109 { | |
| 110 switch (pv.Property.Name) | |
| 111 { | |
| 112 case PROFILE_SHOPPINGCART: SetCartItems(uniqueID, (Cart)pv.PropertyValue, true); break; | |
| 113 case PROFILE_WISHLIST: SetCartItems(uniqueID, (Cart)pv.PropertyValue, false); break; | |
| 114 case PROFILE_ACCOUNT: | |
| 115 if (isAuthenticated) | |
| 116 SetAccountInfo(uniqueID, (Address)pv.PropertyValue); | |
| 117 break; | |
| 118 | |
| 119 default: | |
| 120 throw new ApplicationException(ERR_INVALID_PARAMETER + " name."); | |
| 121 } | |
| 122 } | |
| 123 } | |
| 124 | |
| 125 UpdateActivityDates(username, false); | |
| 126 } | |
| 127 | |
| 128 private int GetUniqueID(string userName, bool isAuthenticated, bool ignoreAuthenticationType, string appName) | |
| 129 { | |
| 130 int? uniqueID = ignoreAuthenticationType ? | |
| 131 Accessor.GetUniqueID (userName, appName) : | |
| 132 Accessor.GetUniqueIDAuth(userName, appName, isAuthenticated); | |
| 133 | |
| 134 return uniqueID ?? Accessor.CreateProfile(userName, appName, isAuthenticated); | |
| 135 } | |
| 136 | |
| 137 private Address GetAccountInfo(string username) | |
| 138 { | |
| 139 return Accessor.GetAccountInfo(username, _applicationName); | |
| 140 } | |
| 141 | |
| 142 private Cart GetCartItems(string username, bool isShoppingCart) | |
| 143 { | |
| 144 Cart cart = new Cart(); | |
| 145 | |
| 146 foreach (CartItem cartItem in Accessor.GetCartItems(username, _applicationName, isShoppingCart)) | |
| 147 cart.Add(cartItem); | |
| 148 | |
| 149 return cart; | |
| 150 } | |
| 151 | |
| 152 private void SetAccountInfo(int uniqueID, Address address) | |
| 153 { | |
| 154 Accessor.SetAccountInfo(uniqueID, address); | |
| 155 } | |
| 156 | |
| 157 private void SetCartItems(int uniqueID, Cart cart, bool isShoppingCart) | |
| 158 { | |
| 159 Accessor.SetCartItems(uniqueID, cart.Items, isShoppingCart); | |
| 160 } | |
| 161 | |
| 162 // UpdateActivityDates | |
| 163 // Updates the LastActivityDate and LastUpdatedDate values | |
| 164 // when profile properties are accessed by the | |
| 165 // GetPropertyValues and SetPropertyValues methods. | |
| 166 // Passing true as the activityOnly parameter will update | |
| 167 // only the LastActivityDate. | |
| 168 private void UpdateActivityDates(string username, bool activityOnly) | |
| 169 { | |
| 170 if (activityOnly) | |
| 171 Accessor.UpdateActivityDate(username, _applicationName); | |
| 172 else | |
| 173 Accessor.UpdateActivityAndUdpateDates(username, _applicationName); | |
| 174 } | |
| 175 | |
| 176 /// <summary> | |
| 177 /// Deletes profile properties and information for the supplied list of profiles. | |
| 178 /// </summary> | |
| 179 /// <param name="profiles">A System.Web.Profile.ProfileInfoCollection of information about profiles that are to be deleted.</param> | |
| 180 /// <returns>The number of profiles deleted from the data source.</returns> | |
| 181 public override int DeleteProfiles(ProfileInfoCollection profiles) | |
| 182 { | |
| 183 int deleteCount = 0; | |
| 184 | |
| 185 foreach (ProfileInfo p in profiles) | |
| 186 if (DeleteProfile(p.UserName)) | |
| 187 deleteCount++; | |
| 188 | |
| 189 return deleteCount; | |
| 190 } | |
| 191 | |
| 192 /// <summary> | |
| 193 /// Deletes profile properties and information for profiles that match the supplied list of user names. | |
| 194 /// </summary> | |
| 195 /// <param name="usernames">A string array of user names for profiles to be deleted.</param> | |
| 196 /// <returns>The number of profiles deleted from the data source.</returns> | |
| 197 public override int DeleteProfiles(string[] usernames) | |
| 198 { | |
| 199 int deleteCount = 0; | |
| 200 | |
| 201 foreach (string user in usernames) | |
| 202 if (DeleteProfile(user)) | |
| 203 deleteCount++; | |
| 204 | |
| 205 return deleteCount; | |
| 206 } | |
| 207 | |
| 208 // DeleteProfile | |
| 209 // Deletes profile data from the database for the specified user name. | |
| 210 private bool DeleteProfile(string username) | |
| 211 { | |
| 212 CheckUserName(username); | |
| 213 | |
| 214 int? uniqueID = Accessor.GetUniqueID(username, _applicationName); | |
| 215 | |
| 216 return uniqueID != null && Accessor.DeleteProfile(uniqueID.Value) > 0; | |
| 217 } | |
| 218 | |
| 219 // Verifies user name for sise and comma | |
| 220 private static void CheckUserName(string userName) | |
| 221 { | |
| 222 if (string.IsNullOrEmpty(userName) || userName.Length > 256 || userName.IndexOf(",") > 0) | |
| 223 throw new ApplicationException(ERR_INVALID_PARAMETER + " user name."); | |
| 224 } | |
| 225 | |
| 226 /// <summary> | |
| 227 /// Deletes all user-profile data for profiles in which the last activity date occurred before the specified date. | |
| 228 /// </summary> | |
| 229 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are deleted.</param> | |
| 230 /// <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> | |
| 231 /// <returns>The number of profiles deleted from the data source.</returns> | |
| 232 public override int DeleteInactiveProfiles(ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate) | |
| 233 { | |
| 234 IList<string> list; | |
| 235 | |
| 236 switch (authenticationOption) | |
| 237 { | |
| 238 case ProfileAuthenticationOption.Anonymous: | |
| 239 list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, true); | |
| 240 break; | |
| 241 | |
| 242 case ProfileAuthenticationOption.Authenticated: | |
| 243 list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, false); | |
| 244 break; | |
| 245 | |
| 246 default: | |
| 247 list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName); | |
| 248 break; | |
| 249 } | |
| 250 | |
| 251 string[] userArray = new string[list.Count]; | |
| 252 | |
| 253 list.CopyTo(userArray, 0); | |
| 254 | |
| 255 return DeleteProfiles(userArray); | |
| 256 } | |
| 257 | |
| 258 /// <summary> | |
| 259 /// Retrieves profile information for profiles in which the user name matches the specified user names. | |
| 260 /// </summary> | |
| 261 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param> | |
| 262 /// <param name="usernameToMatch">The user name to search for.</param> | |
| 263 /// <param name="pageIndex">The index of the page of results to return.</param> | |
| 264 /// <param name="pageSize">The size of the page of results to return.</param> | |
| 265 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param> | |
| 266 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information | |
| 267 /// for profiles where the user name matches the supplied usernameToMatch parameter.</returns> | |
| 268 public override ProfileInfoCollection FindProfilesByUserName( | |
| 269 ProfileAuthenticationOption authenticationOption, string usernameToMatch, | |
| 270 int pageIndex, int pageSize, out int totalRecords) | |
| 271 { | |
| 272 CheckParameters(pageIndex, pageSize); | |
| 273 | |
| 274 return GetProfileInfo(authenticationOption, usernameToMatch, null, pageIndex, pageSize, out totalRecords); | |
| 275 } | |
| 276 | |
| 277 /// <summary> | |
| 278 /// 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. | |
| 279 /// </summary> | |
| 280 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param> | |
| 281 /// <param name="usernameToMatch">The user name to search for.</param> | |
| 282 /// <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> | |
| 283 /// <param name="pageIndex">The index of the page of results to return.</param> | |
| 284 /// <param name="pageSize">The size of the page of results to return.</param> | |
| 285 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param> | |
| 286 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user profile information for inactive profiles where the user name matches the supplied usernameToMatch parameter.</returns> | |
| 287 public override ProfileInfoCollection FindInactiveProfilesByUserName( | |
| 288 ProfileAuthenticationOption authenticationOption, string usernameToMatch, DateTime userInactiveSinceDate, | |
| 289 int pageIndex, int pageSize, out int totalRecords) | |
| 290 { | |
| 291 CheckParameters(pageIndex, pageSize); | |
| 292 | |
| 293 return GetProfileInfo(authenticationOption, usernameToMatch, userInactiveSinceDate, pageIndex, pageSize, out totalRecords); | |
| 294 } | |
| 295 | |
| 296 /// <summary> | |
| 297 /// Retrieves user profile data for all profiles in the data source. | |
| 298 /// </summary> | |
| 299 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param> | |
| 300 /// <param name="pageIndex">The index of the page of results to return.</param> | |
| 301 /// <param name="pageSize">The size of the page of results to return.</param> | |
| 302 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param> | |
| 303 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information for all profiles in the data source.</returns> | |
| 304 public override ProfileInfoCollection GetAllProfiles( | |
| 305 ProfileAuthenticationOption authenticationOption, int pageIndex, int pageSize, out int totalRecords) | |
| 306 { | |
| 307 CheckParameters(pageIndex, pageSize); | |
| 308 | |
| 309 return GetProfileInfo(authenticationOption, null, null, pageIndex, pageSize, out totalRecords); | |
| 310 } | |
| 311 | |
| 312 /// <summary> | |
| 313 /// Retrieves user-profile data from the data source for profiles in which the last activity date occurred on or before the specified date. | |
| 314 /// </summary> | |
| 315 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param> | |
| 316 /// <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> | |
| 317 /// <param name="pageIndex">The index of the page of results to return.</param> | |
| 318 /// <param name="pageSize">The size of the page of results to return.</param> | |
| 319 /// <param name="totalRecords">When this method returns, contains the total number of profiles.</param> | |
| 320 /// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information about the inactive profiles.</returns> | |
| 321 public override ProfileInfoCollection GetAllInactiveProfiles( | |
| 322 ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate, | |
| 323 int pageIndex, int pageSize, out int totalRecords) | |
| 324 { | |
| 325 CheckParameters(pageIndex, pageSize); | |
| 326 | |
| 327 return GetProfileInfo(authenticationOption, null, userInactiveSinceDate, pageIndex, pageSize, out totalRecords); | |
| 328 } | |
| 329 | |
| 330 /// <summary> | |
| 331 /// Returns the number of profiles in which the last activity date occurred on or before the specified date. | |
| 332 /// </summary> | |
| 333 /// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param> | |
| 334 /// <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> | |
| 335 /// <returns>The number of profiles in which the last activity date occurred on or before the specified date.</returns> | |
| 336 public override int GetNumberOfInactiveProfiles( | |
| 337 ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate) | |
| 338 { | |
| 339 int inactiveProfiles = 0; | |
| 340 | |
| 341 ProfileInfoCollection profiles = GetProfileInfo(authenticationOption, null, userInactiveSinceDate, 0, 0, out inactiveProfiles); | |
| 342 | |
| 343 return inactiveProfiles; | |
| 344 } | |
| 345 | |
| 346 private static void CheckParameters(int pageIndex, int pageSize) | |
| 347 { | |
| 348 if (pageIndex < 1 || pageSize < 1) | |
| 349 throw new ApplicationException(ERR_INVALID_PARAMETER + " page index."); | |
| 350 } | |
| 351 | |
| 352 // GetProfileInfo | |
| 353 // Retrieves a count of profiles and creates a | |
| 354 // ProfileInfoCollection from the profile data in the | |
| 355 // database. Called by GetAllProfiles, GetAllInactiveProfiles, | |
| 356 // FindProfilesByUserName, FindInactiveProfilesByUserName, | |
| 357 // and GetNumberOfInactiveProfiles. | |
| 358 // Specifying a pageIndex of 0 retrieves a count of the results only. | |
| 359 private ProfileInfoCollection GetProfileInfo( | |
| 360 ProfileAuthenticationOption authenticationOption, | |
| 361 string usernameToMatch, | |
| 362 DateTime? userInactiveSinceDate, | |
| 363 int pageIndex, | |
| 364 int pageSize, | |
| 365 out int totalRecords) | |
| 366 { | |
| 367 totalRecords = 0; | |
| 368 | |
| 369 ProfileInfoCollection profiles = new ProfileInfoCollection(); | |
| 370 | |
| 371 // Count profiles only. | |
| 372 if (pageSize == 0) | |
| 373 return profiles; | |
| 374 | |
| 375 int counter = 0; | |
| 376 int startIndex = pageSize * (pageIndex - 1); | |
| 377 int endIndex = startIndex + pageSize - 1; | |
| 378 | |
| 379 bool? isAnonymous = null; | |
| 380 | |
| 381 if (authenticationOption == ProfileAuthenticationOption.Anonymous) | |
| 382 isAnonymous = true; | |
| 383 else if (authenticationOption == ProfileAuthenticationOption.Authenticated) | |
| 384 isAnonymous = false; | |
| 385 | |
| 386 foreach (CustomProfile profile in Accessor.GetProfile( | |
| 387 isAnonymous, usernameToMatch, userInactiveSinceDate, _applicationName, out totalRecords)) | |
| 388 { | |
| 389 if (counter >= startIndex) | |
| 390 { | |
| 391 ProfileInfo p = new ProfileInfo( | |
| 392 profile.UserName, | |
| 393 profile.IsAnonymous ?? true, | |
| 394 profile.LastActivityDate ?? DateTime.MinValue, | |
| 395 profile.LastUpdatedDate ?? DateTime.MinValue, 0); | |
| 396 | |
| 397 profiles.Add(p); | |
| 398 } | |
| 399 | |
| 400 if (counter >= endIndex) | |
| 401 break; | |
| 402 | |
| 403 counter++; | |
| 404 } | |
| 405 | |
| 406 return profiles; | |
| 407 } | |
| 408 | |
| 409 #region Accessor | |
| 410 | |
| 411 ProfileAccessor Accessor | |
| 412 { | |
| 413 [System.Diagnostics.DebuggerStepThrough] | |
| 414 get { return ProfileAccessor.CreateInstance(); } | |
| 415 } | |
| 416 | |
| 417 #endregion | |
| 418 } | |
| 419 } |
