Implementing the mapper for Member. Refactoring the MemberProfile, IMember and IMembershipUser interfaces

This commit is contained in:
Morten Christensen
2013-08-28 15:24:22 +02:00
parent 6f63369e11
commit 575abc6abf
9 changed files with 166 additions and 36 deletions

View File

@@ -0,0 +1,12 @@
namespace Umbraco.Core.Models.Membership
{
internal interface IMember : IMembershipUser, IMemberProfile
{
new int Id { get; set; }
}
internal interface IMemberProfile : IProfile
{
}
}

View File

@@ -6,7 +6,7 @@ namespace Umbraco.Core.Models.Membership
{
internal interface IMembershipUser : IMembershipUserId, IAggregateRoot
{
new object Id { get; set; }
/*new object Id { get; set; }*/
string Username { get; set; }
string Email { get; set; }
string Password { get; set; }
@@ -16,10 +16,6 @@ namespace Umbraco.Core.Models.Membership
bool IsApproved { get; set; }
bool IsOnline { get; set; }
bool IsLockedOut { get; set; }
//Was CreationDate
//DateTime CreateDate { get; set; }
//LastActivityDate
//DateTime UpdateDate { get; set; }
DateTime LastLoginDate { get; set; }
DateTime LastPasswordChangeDate { get; set; }
DateTime LastLockoutDate { get; set; }

View File

@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.Serialization;
@@ -17,27 +16,24 @@ namespace Umbraco.Core.Models.Membership
[Serializable]
[DataContract(IsReference = true)]
[DebuggerDisplay("Id: {Id}")]
internal class Member : MemberProfile, IMembershipUser
internal class Member : MemberProfile, IMember
{
private bool _hasIdentity;
private int _id;
private Guid _key;
private DateTime _createDate;
private DateTime _updateDate;
private PropertyCollection _properties;
private int _contentTypeId;
private string _contentTypeAlias;
private static readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo<Member, int>(x => x.Id);
private static readonly PropertyInfo KeySelector = ExpressionHelper.GetPropertyInfo<Member, Guid>(x => x.Key);
private static readonly PropertyInfo CreateDateSelector = ExpressionHelper.GetPropertyInfo<Member, DateTime>(x => x.CreateDate);
private static readonly PropertyInfo UpdateDateSelector = ExpressionHelper.GetPropertyInfo<Member, DateTime>(x => x.UpdateDate);
private static readonly PropertyInfo HasIdentitySelector = ExpressionHelper.GetPropertyInfo<Member, bool>(x => x.HasIdentity);
private readonly static PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo<Member, PropertyCollection>(x => x.Properties);
protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged(PropertyCollectionSelector);
}
private static readonly PropertyInfo DefaultContentTypeIdSelector = ExpressionHelper.GetPropertyInfo<Member, int>(x => x.ContentTypeId);
private static readonly PropertyInfo DefaultContentTypeAliasSelector = ExpressionHelper.GetPropertyInfo<Member, string>(x => x.ContentTypeAlias);
/// <summary>
/// Integer Id
/// </summary>
@@ -386,20 +382,49 @@ namespace Umbraco.Core.Models.Membership
[IgnoreDataMember]
public bool IsOnline { get; set; }
public object ProfileId { get; set; }
public IEnumerable<object> Groups { get; set; }
/// <summary>
/// Guid Id of the curent Version
/// </summary>
[DataMember]
public PropertyCollection Properties
public Guid Version { get; internal set; }
/// <summary>
/// Integer Id of the default ContentType
/// </summary>
[DataMember]
public virtual int ContentTypeId
{
get { return _properties; }
set
get { return _contentTypeId; }
internal set
{
_properties = value;
_properties.CollectionChanged += PropertiesChanged;
SetPropertyValueAndDetectChanges(o =>
{
_contentTypeId = value;
return _contentTypeId;
}, _contentTypeId, DefaultContentTypeIdSelector);
}
}
/// <summary>
/// String alias of the default ContentType
/// </summary>
[DataMember]
public virtual string ContentTypeAlias
{
get { return _contentTypeAlias; }
internal set
{
SetPropertyValueAndDetectChanges(o =>
{
_contentTypeAlias = value;
return _contentTypeAlias;
}, _contentTypeAlias, DefaultContentTypeAliasSelector);
}
}
public object ProfileId { get; set; }
public IEnumerable<object> Groups { get; set; }
#region Internal methods
internal virtual void ResetIdentity()

View File

@@ -1,5 +1,7 @@
using System;
using System.Collections.Specialized;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models.Membership
@@ -12,6 +14,7 @@ namespace Umbraco.Core.Models.Membership
private string _path;
private int _creatorId;
private bool _trashed;
private PropertyCollection _properties;
private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, int>(x => ((IUmbracoEntity)x).ParentId);
private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, int>(x => ((IUmbracoEntity)x).SortOrder);
@@ -19,6 +22,12 @@ namespace Umbraco.Core.Models.Membership
private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, string>(x => ((IUmbracoEntity)x).Path);
private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, int>(x => ((IUmbracoEntity)x).CreatorId);
private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, bool>(x => x.Trashed);
private readonly static PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo<Member, PropertyCollection>(x => x.Properties);
protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged(PropertyCollectionSelector);
}
public abstract new int Id { get; set; }
public abstract Guid Key { get; set; }
@@ -29,6 +38,7 @@ namespace Umbraco.Core.Models.Membership
/// <summary>
/// Profile of the user who created this Content
/// </summary>
[DataMember]
int IUmbracoEntity.CreatorId
{
get
@@ -48,7 +58,8 @@ namespace Umbraco.Core.Models.Membership
/// <summary>
/// Gets or sets the level of the content entity
/// </summary>
int IUmbracoEntity.Level
[DataMember]
int IUmbracoEntity.Level
{
get { return _level; }
set
@@ -63,6 +74,7 @@ namespace Umbraco.Core.Models.Membership
/// <summary>
/// Gets or sets the Id of the Parent entity
/// </summary>
[DataMember]
int IUmbracoEntity.ParentId
{
get
@@ -84,6 +96,7 @@ namespace Umbraco.Core.Models.Membership
/// <summary>
/// Gets or sets the path
/// </summary>
[DataMember]
string IUmbracoEntity.Path
{
get { return _path; }
@@ -100,6 +113,7 @@ namespace Umbraco.Core.Models.Membership
/// <summary>
/// Gets or sets the sort order of the content entity
/// </summary>
[DataMember]
int IUmbracoEntity.SortOrder
{
get { return _sortOrder; }
@@ -117,6 +131,7 @@ namespace Umbraco.Core.Models.Membership
/// Boolean indicating whether this Content is Trashed or not.
/// If Content is Trashed it will be located in the Recyclebin.
/// </summary>
[DataMember]
public virtual bool Trashed
{
get { return _trashed; }
@@ -129,5 +144,16 @@ namespace Umbraco.Core.Models.Membership
}, _trashed, TrashedSelector);
}
}
[DataMember]
public PropertyCollection Properties
{
get { return _properties; }
set
{
_properties = value;
_properties.CollectionChanged += PropertiesChanged;
}
}
}
}

View File

@@ -8,9 +8,9 @@ using Umbraco.Core.Models.Rdbms;
namespace Umbraco.Core.Persistence.Factories
{
internal class MemberReadOnlyFactory : IEntityFactory<IMembershipUser, MemberReadOnlyDto>
internal class MemberReadOnlyFactory : IEntityFactory<IMember, MemberReadOnlyDto>
{
public IMembershipUser BuildEntity(MemberReadOnlyDto dto)
public IMember BuildEntity(MemberReadOnlyDto dto)
{
var member = new Member
{
@@ -24,7 +24,9 @@ namespace Umbraco.Core.Persistence.Factories
ProviderUserKey = dto.UniqueId,
Trashed = dto.Trashed,
Key = dto.UniqueId.Value,
ProfileId = dto.UniqueId.Value
ProfileId = dto.UniqueId.Value,
ContentTypeId = dto.ContentTypeId,
ContentTypeAlias = dto.ContentTypeAlias
};
((IUmbracoEntity)member).CreatorId = dto.UserId.Value;
@@ -55,7 +57,7 @@ namespace Umbraco.Core.Persistence.Factories
return member;
}
public MemberReadOnlyDto BuildDto(IMembershipUser entity)
public MemberReadOnlyDto BuildDto(IMember entity)
{
throw new System.NotImplementedException();
}

View File

@@ -0,0 +1,67 @@
using System.Collections.Concurrent;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Models.Rdbms;
namespace Umbraco.Core.Persistence.Mappers
{
/// <summary>
/// Represents a <see cref="Member"/> to DTO mapper used to translate the properties of the public api
/// implementation to that of the database's DTO as sql: [tableName].[columnName].
/// </summary>
[MapperFor(typeof(IMember))]
[MapperFor(typeof(Member))]
public sealed class MemberMapper : BaseMapper
{
private static readonly ConcurrentDictionary<string, DtoMapModel> PropertyInfoCacheInstance = new ConcurrentDictionary<string, DtoMapModel>();
//NOTE: its an internal class but the ctor must be public since we're using Activator.CreateInstance to create it
// otherwise that would fail because there is no public constructor.
public MemberMapper()
{
BuildMap();
}
#region Overrides of BaseMapper
internal override ConcurrentDictionary<string, DtoMapModel> PropertyInfoCache
{
get { return PropertyInfoCacheInstance; }
}
internal override void BuildMap()
{
CacheMap<Member, NodeDto>(src => src.Id, dto => dto.NodeId);
CacheMap<Member, NodeDto>(src => src.CreateDate, dto => dto.CreateDate);
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).Level, dto => dto.Level);
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).ParentId, dto => dto.ParentId);
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).Path, dto => dto.Path);
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).SortOrder, dto => dto.SortOrder);
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).CreatorId, dto => dto.UserId);
CacheMap<Member, NodeDto>(src => src.Name, dto => dto.Text);
CacheMap<Member, NodeDto>(src => src.Trashed, dto => dto.Trashed);
CacheMap<Member, NodeDto>(src => src.Key, dto => dto.UniqueId);
CacheMap<Member, NodeDto>(src => src.ProfileId, dto => dto.UniqueId);
CacheMap<Member, ContentDto>(src => src.ContentTypeId, dto => dto.ContentTypeId);
CacheMap<Member, ContentTypeDto>(src => src.ContentTypeAlias, dto => dto.Alias);
CacheMap<Member, ContentVersionDto>(src => src.UpdateDate, dto => dto.VersionDate);
CacheMap<Member, ContentVersionDto>(src => src.Version, dto => dto.VersionId);
CacheMap<Member, MemberDto>(src => src.Email, dto => dto.Email);
CacheMap<Member, MemberDto>(src => src.Username, dto => dto.LoginName);
CacheMap<Member, MemberDto>(src => src.Password, dto => dto.Password);
CacheMap<Member, PropertyDataDto>(src => src.IsApproved, dto => dto.Integer);
CacheMap<Member, PropertyDataDto>(src => src.IsLockedOut, dto => dto.Integer);
CacheMap<Member, PropertyDataDto>(src => src.Comments, dto => dto.Text);
CacheMap<Member, PropertyDataDto>(src => src.PasswordAnswer, dto => dto.VarChar);
CacheMap<Member, PropertyDataDto>(src => src.PasswordQuestion, dto => dto.VarChar);
CacheMap<Member, PropertyDataDto>(src => src.FailedPasswordAttempts, dto => dto.Integer);
CacheMap<Member, PropertyDataDto>(src => src.LastLockoutDate, dto => dto.Date);
CacheMap<Member, PropertyDataDto>(src => src.LastLoginDate, dto => dto.Date);
CacheMap<Member, PropertyDataDto>(src => src.LastPasswordChangeDate, dto => dto.Date);
}
#endregion
}
}

View File

@@ -2,7 +2,7 @@
namespace Umbraco.Core.Persistence.Repositories
{
internal interface IMemberRepository : IRepositoryVersionable<int, IMembershipUser>
internal interface IMemberRepository : IRepositoryVersionable<int, IMember>
{
}

View File

@@ -11,7 +11,7 @@ using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Persistence.Repositories
{
internal class MemberRepository : VersionableRepositoryBase<int, IMembershipUser>, IMemberRepository
internal class MemberRepository : VersionableRepositoryBase<int, IMember>, IMemberRepository
{
public MemberRepository(IDatabaseUnitOfWork work) : base(work)
{
@@ -33,7 +33,7 @@ namespace Umbraco.Core.Persistence.Repositories
#region Overrides of RepositoryBase<int, IMembershipUser>
protected override IMembershipUser PerformGet(int id)
protected override IMember PerformGet(int id)
{
var sql = GetBaseQuery(false);
sql.Where(GetBaseWhereClause(), new { Id = id });
@@ -52,12 +52,12 @@ namespace Umbraco.Core.Persistence.Repositories
return member;
}
protected override IEnumerable<IMembershipUser> PerformGetAll(params int[] ids)
protected override IEnumerable<IMember> PerformGetAll(params int[] ids)
{
throw new NotImplementedException();
}
protected override IEnumerable<IMembershipUser> PerformGetByQuery(IQuery<IMembershipUser> query)
protected override IEnumerable<IMember> PerformGetByQuery(IQuery<IMember> query)
{
throw new NotImplementedException();
}
@@ -110,12 +110,12 @@ namespace Umbraco.Core.Persistence.Repositories
#region Unit of Work Implementation
protected override void PersistNewItem(IMembershipUser entity)
protected override void PersistNewItem(IMember entity)
{
throw new NotImplementedException();
}
protected override void PersistUpdatedItem(IMembershipUser entity)
protected override void PersistUpdatedItem(IMember entity)
{
throw new NotImplementedException();
}
@@ -124,7 +124,7 @@ namespace Umbraco.Core.Persistence.Repositories
#region Overrides of VersionableRepositoryBase<IMembershipUser>
public override IMembershipUser GetByVersion(Guid versionId)
public override IMember GetByVersion(Guid versionId)
{
throw new NotImplementedException();
}

View File

@@ -200,6 +200,7 @@
<Compile Include="Models\IDictionaryTranslation.cs" />
<Compile Include="Models\IFile.cs" />
<Compile Include="Models\ILanguage.cs" />
<Compile Include="Models\Membership\IMember.cs" />
<Compile Include="Models\Membership\UmbracoMember.cs" />
<Compile Include="Models\Membership\UmbracoMembershipUser.cs" />
<Compile Include="Models\Rdbms\MemberReadOnlyDto.cs" />
@@ -264,6 +265,7 @@
<Compile Include="Persistence\FaultHandling\Strategies\SqlAzureTransientErrorDetectionStrategy.cs" />
<Compile Include="Persistence\FaultHandling\ThrottlingCondition.cs" />
<Compile Include="Persistence\Mappers\MapperForAttribute.cs" />
<Compile Include="Persistence\Mappers\MemberMapper.cs" />
<Compile Include="Persistence\Mappers\PetaPocoMapper.cs" />
<Compile Include="Persistence\DatabaseAnnotations\ConstraintAttribute.cs" />
<Compile Include="Persistence\DatabaseAnnotations\SpecialDbTypeAttribute.cs" />