diff --git a/src/Umbraco.Core/Composing/SetCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/SetCollectionBuilderBase.cs
new file mode 100644
index 0000000000..3698b7e801
--- /dev/null
+++ b/src/Umbraco.Core/Composing/SetCollectionBuilderBase.cs
@@ -0,0 +1,167 @@
+using System;
+using System.Collections.Generic;
+
+namespace Umbraco.Core.Composing
+{
+ ///
+ /// Implements an un-ordered collection builder.
+ ///
+ /// The type of the builder.
+ /// The type of the collection.
+ /// The type of the items.
+ public abstract class SetCollectionBuilderBase : CollectionBuilderBase
+ where TBuilder : SetCollectionBuilderBase
+ where TCollection : class, IBuilderCollection
+ {
+ protected abstract TBuilder This { get; }
+
+ ///
+ /// Clears all types in the collection.
+ ///
+ /// The builder.
+ public TBuilder Clear()
+ {
+ Configure(types => types.Clear());
+ return This;
+ }
+
+ ///
+ /// Adds a type to the collection.
+ ///
+ /// The type to append.
+ /// The builder.
+ public TBuilder Add()
+ where T : TItem
+ {
+ Configure(types =>
+ {
+ var type = typeof(T);
+ if (types.Contains(type)) types.Remove(type);
+ types.Add(type);
+ });
+ return This;
+ }
+
+ ///
+ /// Adds a type to the collection.
+ ///
+ /// The type to append.
+ /// The builder.
+ public TBuilder Add(Type type)
+ {
+ Configure(types =>
+ {
+ EnsureType(type, "register");
+ if (types.Contains(type)) types.Remove(type);
+ types.Add(type);
+ });
+ return This;
+ }
+
+ ///
+ /// Adds types to the collections.
+ ///
+ /// The types to append.
+ /// The builder.
+ public TBuilder Add(IEnumerable types)
+ {
+ Configure(list =>
+ {
+ foreach (var type in types)
+ {
+ // would be detected by CollectionBuilderBase when registering, anyways, but let's fail fast
+ EnsureType(type, "register");
+ if (list.Contains(type)) list.Remove(type);
+ list.Add(type);
+ }
+ });
+ return This;
+ }
+
+ ///
+ /// Removes a type from the collection.
+ ///
+ /// The type to remove.
+ /// The builder.
+ public TBuilder Remove()
+ where T : TItem
+ {
+ Configure(types =>
+ {
+ var type = typeof(T);
+ if (types.Contains(type)) types.Remove(type);
+ });
+ return This;
+ }
+
+ ///
+ /// Removes a type from the collection.
+ ///
+ /// The type to remove.
+ /// The builder.
+ public TBuilder Remove(Type type)
+ {
+ Configure(types =>
+ {
+ EnsureType(type, "remove");
+ if (types.Contains(type)) types.Remove(type);
+ });
+ return This;
+ }
+
+ ///
+ /// Replaces a type in the collection.
+ ///
+ /// The type to replace.
+ /// The type to insert.
+ /// The builder.
+ /// Throws if the type to replace does not already belong to the collection.
+ public TBuilder Replace()
+ where TReplaced : TItem
+ where T : TItem
+ {
+ Configure(types =>
+ {
+ var typeReplaced = typeof(TReplaced);
+ var type = typeof(T);
+ if (typeReplaced == type) return;
+
+ var index = types.IndexOf(typeReplaced);
+ if (index < 0) throw new InvalidOperationException();
+
+ if (types.Contains(type)) types.Remove(type);
+ index = types.IndexOf(typeReplaced); // in case removing type changed index
+ types.Insert(index, type);
+ types.Remove(typeReplaced);
+ });
+ return This;
+ }
+
+ ///
+ /// Replaces a type in the collection.
+ ///
+ /// The type to replace.
+ /// The type to insert.
+ /// The builder.
+ /// Throws if the type to replace does not already belong to the collection.
+ public TBuilder Replace(Type typeReplaced, Type type)
+ {
+ Configure(types =>
+ {
+ EnsureType(typeReplaced, "find");
+ EnsureType(type, "register");
+
+ if (typeReplaced == type) return;
+
+ var index = types.IndexOf(typeReplaced);
+ if (index < 0) throw new InvalidOperationException();
+
+ if (types.Contains(type)) types.Remove(type);
+ index = types.IndexOf(typeReplaced); // in case removing type changed index
+ types.Insert(index, type);
+ types.Remove(typeReplaced);
+ });
+ return This;
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Persistence/Mappers/AccessMapper.cs b/src/Umbraco.Core/Persistence/Mappers/AccessMapper.cs
index 0465086810..271f208585 100644
--- a/src/Umbraco.Core/Persistence/Mappers/AccessMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/AccessMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -7,18 +8,15 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(PublicAccessEntry))]
public sealed class AccessMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public AccessMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(src => src.Key, dto => dto.Id);
- CacheMap(src => src.LoginNodeId, dto => dto.LoginNodeId);
- CacheMap(src => src.NoAccessNodeId, dto => dto.NoAccessNodeId);
- CacheMap(src => src.ProtectedNodeId, dto => dto.NodeId);
- CacheMap(src => src.CreateDate, dto => dto.CreateDate);
- CacheMap(src => src.UpdateDate, dto => dto.UpdateDate);
+ DefineMap(nameof(PublicAccessEntry.Key), nameof(AccessDto.Id));
+ DefineMap(nameof(PublicAccessEntry.LoginNodeId), nameof(AccessDto.LoginNodeId));
+ DefineMap(nameof(PublicAccessEntry.NoAccessNodeId), nameof(AccessDto.NoAccessNodeId));
+ DefineMap(nameof(PublicAccessEntry.ProtectedNodeId), nameof(AccessDto.NodeId));
+ DefineMap(nameof(PublicAccessEntry.CreateDate), nameof(AccessDto.CreateDate));
+ DefineMap(nameof(PublicAccessEntry.UpdateDate), nameof(AccessDto.UpdateDate));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/AuditEntryMapper.cs b/src/Umbraco.Core/Persistence/Mappers/AuditEntryMapper.cs
index 28c7c1eeec..5d23f8edf1 100644
--- a/src/Umbraco.Core/Persistence/Mappers/AuditEntryMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/AuditEntryMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -11,21 +12,18 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(AuditEntry))]
public sealed class AuditEntryMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public AuditEntryMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(entity => entity.Id, dto => dto.Id);
- CacheMap(entity => entity.PerformingUserId, dto => dto.PerformingUserId);
- CacheMap(entity => entity.PerformingDetails, dto => dto.PerformingDetails);
- CacheMap(entity => entity.PerformingIp, dto => dto.PerformingIp);
- CacheMap(entity => entity.EventDateUtc, dto => dto.EventDateUtc);
- CacheMap(entity => entity.AffectedUserId, dto => dto.AffectedUserId);
- CacheMap(entity => entity.AffectedDetails, dto => dto.AffectedDetails);
- CacheMap(entity => entity.EventType, dto => dto.EventType);
- CacheMap(entity => entity.EventDetails, dto => dto.EventDetails);
+ DefineMap(nameof(AuditEntry.Id), nameof(AuditEntryDto.Id));
+ DefineMap(nameof(AuditEntry.PerformingUserId), nameof(AuditEntryDto.PerformingUserId));
+ DefineMap(nameof(AuditEntry.PerformingDetails), nameof(AuditEntryDto.PerformingDetails));
+ DefineMap(nameof(AuditEntry.PerformingIp), nameof(AuditEntryDto.PerformingIp));
+ DefineMap(nameof(AuditEntry.EventDateUtc), nameof(AuditEntryDto.EventDateUtc));
+ DefineMap(nameof(AuditEntry.AffectedUserId), nameof(AuditEntryDto.AffectedUserId));
+ DefineMap(nameof(AuditEntry.AffectedDetails), nameof(AuditEntryDto.AffectedDetails));
+ DefineMap(nameof(AuditEntry.EventType), nameof(AuditEntryDto.EventType));
+ DefineMap(nameof(AuditEntry.EventDetails), nameof(AuditEntryDto.EventDetails));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/AuditItemMapper.cs b/src/Umbraco.Core/Persistence/Mappers/AuditItemMapper.cs
index ad1964ee07..bada61a097 100644
--- a/src/Umbraco.Core/Persistence/Mappers/AuditItemMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/AuditItemMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -8,17 +9,14 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(IAuditItem))]
public sealed class AuditItemMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public AuditItemMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(src => src.Id, dto => dto.NodeId);
- CacheMap(src => src.CreateDate, dto => dto.Datestamp);
- CacheMap(src => src.UserId, dto => dto.UserId);
- CacheMap(src => src.AuditType, dto => dto.Header);
- CacheMap(src => src.Comment, dto => dto.Comment);
+ DefineMap(nameof(AuditItem.Id), nameof(LogDto.NodeId));
+ DefineMap(nameof(AuditItem.CreateDate), nameof(LogDto.Datestamp));
+ DefineMap(nameof(AuditItem.UserId), nameof(LogDto.UserId));
+ DefineMap(nameof(AuditItem.AuditType), nameof(LogDto.Header));
+ DefineMap(nameof(AuditItem.Comment), nameof(LogDto.Comment));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs b/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs
index 22421eca53..88b6aed923 100644
--- a/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs
@@ -1,7 +1,5 @@
using System;
using System.Collections.Concurrent;
-using System.Linq.Expressions;
-using System.Reflection;
using NPoco;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Composing;
@@ -10,22 +8,38 @@ namespace Umbraco.Core.Persistence.Mappers
{
public abstract class BaseMapper : IDiscoverable
{
- protected BaseMapper()
+ private readonly ISqlSyntaxProvider _sqlSyntax;
+ private readonly ConcurrentDictionary> _maps;
+
+ protected BaseMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
{
- Build();
+ _sqlSyntax = sqlContext.SqlSyntax;
+ _maps = maps;
}
- internal abstract ConcurrentDictionary PropertyInfoCache { get; }
-
- private void Build()
+ internal string Map(string propertyName, bool throws = false)
{
- BuildMap();
+ if (!_maps.TryGetValue(GetType(), out var mapperMaps))
+ throw new InvalidOperationException($"No maps defined for mapper {GetType().FullName}.");
+ if (!mapperMaps.TryGetValue(propertyName, out var mappedName))
+ throw new InvalidOperationException($"No map defined by mapper {GetType().FullName} for property {propertyName}.");
+ return mappedName;
}
- protected abstract void BuildMap();
-
+ // fixme kill
+ /*
internal string Map(ISqlSyntaxProvider sqlSyntax, string propertyName, bool throws = false)
{
+ // fixme mapping a string to a string - should be a dictionary!
+ // and then why have the other dictionary? should BuildMap(syntax) => directly build the correct string
+
+ /-*
+ var propertyInfo = PropertyInfoCache[propertyName].PropertyInfo; // fixme - tryGet
+ var tableName = propertyInfo.DeclaringType.FirstAttribute().Value;
+ var columnName = propertyInfo.FirstAttribute().Name;
+ var mapped = sqlSyntax.GetQuotedTableName(tableName) + "." + sqlSyntax.GetQuotedColumnName(columnName);
+ *-/
+
if (PropertyInfoCache.TryGetValue(propertyName, out var dtoTypeProperty))
return GetColumnName(sqlSyntax, dtoTypeProperty.Type, dtoTypeProperty.PropertyInfo);
@@ -40,8 +54,36 @@ namespace Umbraco.Core.Persistence.Mappers
var property = ResolveMapping(sourceMember, destinationMember);
PropertyInfoCache.AddOrUpdate(property.SourcePropertyName, property, (x, y) => property);
}
+ */
- internal DtoMapModel ResolveMapping(Expression> sourceMember, Expression> destinationMember)
+ //protected void DefineMap(string sourceName, Expression> targetMember)
+ protected void DefineMap(string sourceName, string targetName)
+ {
+ var sourceType = typeof(TSource);
+ var targetType = typeof(TTarget);
+
+ // TODO ensure that sourceName is a valid sourceType property (but, slow?)
+
+ var tableNameAttribute = targetType.FirstAttribute();
+ if (tableNameAttribute == null) throw new InvalidOperationException($"Type {targetType.FullName} is not marked with a TableName attribute.");
+ var tableName = tableNameAttribute.Value;
+
+ // TODO maybe get all properties once and then index them
+ var targetProperty = targetType.GetProperty(targetName);
+ if (targetProperty == null) throw new InvalidOperationException($"Type {targetType.FullName} does not have a property named {targetName}.");
+ var columnAttribute = targetProperty.FirstAttribute();
+ if (columnAttribute == null) throw new InvalidOperationException($"Property {targetType.FullName}.{targetName} is not marked with a Column attribute.");
+
+ var columnName = columnAttribute.Name;
+ var columnMap = _sqlSyntax.GetQuotedTableName(tableName) + "." + _sqlSyntax.GetQuotedColumnName(columnName);
+
+ var mapperMaps = _maps.GetOrAdd(GetType(), type => new ConcurrentDictionary());
+ mapperMaps[sourceName] = columnMap;
+ }
+
+ // fixme kill
+ /*
+ private static DtoMapModel ResolveMapping(Expression> sourceMember, Expression> destinationMember)
{
var source = ExpressionHelper.FindProperty(sourceMember);
var destination = (PropertyInfo) ExpressionHelper.FindProperty(destinationMember).Item1;
@@ -54,7 +96,7 @@ namespace Umbraco.Core.Persistence.Mappers
return new DtoMapModel(typeof(TDestination), destination, source.Item1.Name);
}
- internal virtual string GetColumnName(ISqlSyntaxProvider sqlSyntax, Type dtoType, PropertyInfo dtoProperty)
+ private static string GetColumnName(ISqlSyntaxProvider sqlSyntax, Type dtoType, PropertyInfo dtoProperty)
{
var tableNameAttribute = dtoType.FirstAttribute();
var tableName = tableNameAttribute.Value;
@@ -65,5 +107,6 @@ namespace Umbraco.Core.Persistence.Mappers
var columnMap = sqlSyntax.GetQuotedTableName(tableName) + "." + sqlSyntax.GetQuotedColumnName(columnName);
return columnMap;
}
+ */
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/ConsentMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ConsentMapper.cs
index 063197d1a2..b8cfefae24 100644
--- a/src/Umbraco.Core/Persistence/Mappers/ConsentMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/ConsentMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -11,20 +12,17 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(Consent))]
public sealed class ConsentMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public ConsentMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(entity => entity.Id, dto => dto.Id);
- CacheMap(entity => entity.Current, dto => dto.Current);
- CacheMap(entity => entity.CreateDate, dto => dto.CreateDate);
- CacheMap(entity => entity.Source, dto => dto.Source);
- CacheMap(entity => entity.Context, dto => dto.Context);
- CacheMap(entity => entity.Action, dto => dto.Action);
- CacheMap(entity => entity.State, dto => dto.State);
- CacheMap(entity => entity.Comment, dto => dto.Comment);
+ DefineMap(nameof(Consent.Id), nameof(ConsentDto.Id));
+ DefineMap(nameof(Consent.Current), nameof(ConsentDto.Current));
+ DefineMap(nameof(Consent.CreateDate), nameof(ConsentDto.CreateDate));
+ DefineMap(nameof(Consent.Source), nameof(ConsentDto.Source));
+ DefineMap(nameof(Consent.Context), nameof(ConsentDto.Context));
+ DefineMap(nameof(Consent.Action), nameof(ConsentDto.Action));
+ DefineMap(nameof(Consent.State), nameof(ConsentDto.State));
+ DefineMap(nameof(Consent.Comment), nameof(ConsentDto.Comment));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs
index 2cc3a5b140..1b75db38ef 100644
--- a/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -12,36 +13,31 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(IContent))]
public sealed class ContentMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public ContentMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- if (PropertyInfoCache.IsEmpty == false) return;
+ DefineMap(nameof(Content.Id), nameof(NodeDto.NodeId));
+ DefineMap(nameof(Content.Key), nameof(NodeDto.UniqueId));
- CacheMap(src => src.Id, dto => dto.NodeId);
- CacheMap(src => src.Key, dto => dto.UniqueId);
+ DefineMap(nameof(Content.VersionId), nameof(ContentVersionDto.Id));
+ DefineMap(nameof(Content.Name), nameof(ContentVersionDto.Text));
- CacheMap(src => src.VersionId, dto => dto.Id);
- CacheMap(src => src.Name, dto => dto.Text);
+ DefineMap(nameof(Content.ParentId), nameof(NodeDto.ParentId));
+ DefineMap(nameof(Content.Level), nameof(NodeDto.Level));
+ DefineMap(nameof(Content.Path), nameof(NodeDto.Path));
+ DefineMap(nameof(Content.SortOrder), nameof(NodeDto.SortOrder));
+ DefineMap(nameof(Content.Trashed), nameof(NodeDto.Trashed));
- CacheMap(src => src.ParentId, dto => dto.ParentId);
- CacheMap(src => src.Level, dto => dto.Level);
- CacheMap(src => src.Path, dto => dto.Path);
- CacheMap(src => src.SortOrder, dto => dto.SortOrder);
- CacheMap(src => src.Trashed, dto => dto.Trashed);
+ DefineMap(nameof(Content.CreateDate), nameof(NodeDto.CreateDate));
+ DefineMap(nameof(Content.CreatorId), nameof(NodeDto.UserId));
+ DefineMap(nameof(Content.ContentTypeId), nameof(ContentDto.ContentTypeId));
- CacheMap(src => src.CreateDate, dto => dto.CreateDate);
- CacheMap(src => src.CreatorId, dto => dto.UserId);
- CacheMap(src => src.ContentTypeId, dto => dto.ContentTypeId);
+ DefineMap(nameof(Content.UpdateDate), nameof(ContentVersionDto.VersionDate));
+ DefineMap(nameof(Content.Published), nameof(DocumentDto.Published));
- CacheMap(src => src.UpdateDate, dto => dto.VersionDate);
- CacheMap(src => src.Published, dto => dto.Published);
-
- //CacheMap(src => src.Name, dto => dto.Alias);
+ //DefineMap(nameof(Content.Name), nameof(DocumentDto.Alias));
//CacheMap(src => src, dto => dto.Newest);
- //CacheMap(src => src.Template, dto => dto.TemplateId);
+ //DefineMap(nameof(Content.Template), nameof(DocumentDto.TemplateId));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs
index a24963bace..c87ca1a321 100644
--- a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -12,31 +13,26 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(IContentType))]
public sealed class ContentTypeMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public ContentTypeMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- if (PropertyInfoCache.IsEmpty == false) return;
-
- CacheMap(src => src.Id, dto => dto.NodeId);
- CacheMap(src => src.CreateDate, dto => dto.CreateDate);
- CacheMap(src => src.Level, dto => dto.Level);
- CacheMap(src => src.ParentId, dto => dto.ParentId);
- CacheMap(src => src.Path, dto => dto.Path);
- CacheMap(src => src.SortOrder, dto => dto.SortOrder);
- CacheMap(src => src.Name, dto => dto.Text);
- CacheMap(src => src.Trashed, dto => dto.Trashed);
- CacheMap(src => src.Key, dto => dto.UniqueId);
- CacheMap(src => src.CreatorId, dto => dto.UserId);
- CacheMap(src => src.Alias, dto => dto.Alias);
- CacheMap(src => src.AllowedAsRoot, dto => dto.AllowAtRoot);
- CacheMap(src => src.Description, dto => dto.Description);
- CacheMap(src => src.Icon, dto => dto.Icon);
- CacheMap(src => src.IsContainer, dto => dto.IsContainer);
- CacheMap(src => src.IsElement, dto => dto.IsElement);
- CacheMap(src => src.Thumbnail, dto => dto.Thumbnail);
+ DefineMap(nameof(ContentType.Id), nameof(NodeDto.NodeId));
+ DefineMap(nameof(ContentType.CreateDate), nameof(NodeDto.CreateDate));
+ DefineMap(nameof(ContentType.Level), nameof(NodeDto.Level));
+ DefineMap(nameof(ContentType.ParentId), nameof(NodeDto.ParentId));
+ DefineMap(nameof(ContentType.Path), nameof(NodeDto.Path));
+ DefineMap(nameof(ContentType.SortOrder), nameof(NodeDto.SortOrder));
+ DefineMap(nameof(ContentType.Name), nameof(NodeDto.Text));
+ DefineMap(nameof(ContentType.Trashed), nameof(NodeDto.Trashed));
+ DefineMap(nameof(ContentType.Key), nameof(NodeDto.UniqueId));
+ DefineMap(nameof(ContentType.CreatorId), nameof(NodeDto.UserId));
+ DefineMap(nameof(ContentType.Alias), nameof(ContentTypeDto.Alias));
+ DefineMap(nameof(ContentType.AllowedAsRoot), nameof(ContentTypeDto.AllowAtRoot));
+ DefineMap(nameof(ContentType.Description), nameof(ContentTypeDto.Description));
+ DefineMap(nameof(ContentType.Icon), nameof(ContentTypeDto.Icon));
+ DefineMap(nameof(ContentType.IsContainer), nameof(ContentTypeDto.IsContainer));
+ DefineMap(nameof(ContentType.IsElement), nameof(ContentTypeDto.IsElement));
+ DefineMap(nameof(ContentType.Thumbnail), nameof(ContentTypeDto.Thumbnail));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs
index a67f9301b2..266adb0aeb 100644
--- a/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -12,25 +13,21 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(IDataType))]
public sealed class DataTypeMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public DataTypeMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(src => src.Id, dto => dto.NodeId);
- CacheMap(src => src.CreateDate, dto => dto.CreateDate);
- CacheMap(src => src.Level, dto => dto.Level);
- CacheMap(src => src.ParentId, dto => dto.ParentId);
- CacheMap(src => src.Path, dto => dto.Path);
- CacheMap(src => src.SortOrder, dto => dto.SortOrder);
- CacheMap(src => src.Name, dto => dto.Text);
- CacheMap(src => src.Trashed, dto => dto.Trashed);
- CacheMap(src => src.Key, dto => dto.UniqueId);
- CacheMap(src => src.CreatorId, dto => dto.UserId);
- CacheMap(src => src.EditorAlias, dto => dto.EditorAlias);
- CacheMap(src => src.DatabaseType, dto => dto.DbType);
-
+ DefineMap(nameof(DataType.Id), nameof(NodeDto.NodeId));
+ DefineMap(nameof(DataType.CreateDate), nameof(NodeDto.CreateDate));
+ DefineMap(nameof(DataType.Level), nameof(NodeDto.Level));
+ DefineMap(nameof(DataType.ParentId), nameof(NodeDto.ParentId));
+ DefineMap(nameof(DataType.Path), nameof(NodeDto.Path));
+ DefineMap(nameof(DataType.SortOrder), nameof(NodeDto.SortOrder));
+ DefineMap(nameof(DataType.Name), nameof(NodeDto.Text));
+ DefineMap(nameof(DataType.Trashed), nameof(NodeDto.Trashed));
+ DefineMap(nameof(DataType.Key), nameof(NodeDto.UniqueId));
+ DefineMap(nameof(DataType.CreatorId), nameof(NodeDto.UserId));
+ DefineMap(nameof(DataType.EditorAlias), nameof(DataTypeDto.EditorAlias));
+ DefineMap(nameof(DataType.DatabaseType), nameof(DataTypeDto.DbType));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs
index 0c2773c2dd..467eb55ebe 100644
--- a/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -12,16 +13,13 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(IDictionaryItem))]
public sealed class DictionaryMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public DictionaryMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(src => src.Id, dto => dto.PrimaryKey);
- CacheMap(src => src.Key, dto => dto.UniqueId);
- CacheMap(src => src.ItemKey, dto => dto.Key);
- CacheMap(src => src.ParentId, dto => dto.Parent);
+ DefineMap(nameof(DictionaryItem.Id), nameof(DictionaryDto.PrimaryKey));
+ DefineMap(nameof(DictionaryItem.Key), nameof(DictionaryDto.UniqueId));
+ DefineMap(nameof(DictionaryItem.ItemKey), nameof(DictionaryDto.Key));
+ DefineMap(nameof(DictionaryItem.ParentId), nameof(DictionaryDto.Parent));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs
index 3f8641b959..6383604dbe 100644
--- a/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -12,16 +13,13 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(IDictionaryTranslation))]
public sealed class DictionaryTranslationMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public DictionaryTranslationMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(src => src.Id, dto => dto.PrimaryKey);
- CacheMap(src => src.Key, dto => dto.UniqueId);
- CacheMap(src => src.Language, dto => dto.LanguageId);
- CacheMap(src => src.Value, dto => dto.Value);
+ DefineMap(nameof(DictionaryTranslation.Id), nameof(LanguageTextDto.PrimaryKey));
+ DefineMap(nameof(DictionaryTranslation.Key), nameof(LanguageTextDto.UniqueId));
+ DefineMap(nameof(DictionaryTranslation.Language), nameof(LanguageTextDto.LanguageId));
+ DefineMap(nameof(DictionaryTranslation.Value), nameof(LanguageTextDto.Value));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs
index 0bce8d7538..4d91b54691 100644
--- a/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/DomainMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -8,16 +9,13 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(UmbracoDomain))]
public sealed class DomainMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public DomainMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- CacheMap(src => src.Id, dto => dto.Id);
- CacheMap(src => src.RootContentId, dto => dto.RootStructureId);
- CacheMap(src => src.LanguageId, dto => dto.DefaultLanguage);
- CacheMap(src => src.DomainName, dto => dto.DomainName);
+ DefineMap(nameof(UmbracoDomain.Id), nameof(DomainDto.Id));
+ DefineMap(nameof(UmbracoDomain.RootContentId), nameof(DomainDto.RootStructureId));
+ DefineMap(nameof(UmbracoDomain.LanguageId), nameof(DomainDto.DefaultLanguage));
+ DefineMap(nameof(UmbracoDomain.DomainName), nameof(DomainDto.DomainName));
}
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/DtoMapModel.cs b/src/Umbraco.Core/Persistence/Mappers/DtoMapModel.cs
deleted file mode 100644
index ebf16a1d36..0000000000
--- a/src/Umbraco.Core/Persistence/Mappers/DtoMapModel.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-using System.Reflection;
-
-namespace Umbraco.Core.Persistence.Mappers
-{
- internal class DtoMapModel
- {
- public DtoMapModel(Type type, PropertyInfo propertyInfo, string sourcePropertyName)
- {
- Type = type;
- PropertyInfo = propertyInfo;
- SourcePropertyName = sourcePropertyName;
- }
-
- public string SourcePropertyName { get; private set; }
- public Type Type { get; private set; }
- public PropertyInfo PropertyInfo { get; private set; }
- }
-}
diff --git a/src/Umbraco.Core/Persistence/Mappers/ExternalLoginMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ExternalLoginMapper.cs
index d3fb24273b..3f95dbccc9 100644
--- a/src/Umbraco.Core/Persistence/Mappers/ExternalLoginMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/ExternalLoginMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Persistence.Dtos;
@@ -8,25 +9,14 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(IdentityUserLogin))]
public sealed class ExternalLoginMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
- public ExternalLoginMapper()
+ public ExternalLoginMapper(ISqlContext sqlContext, ConcurrentDictionary> maps)
+ : base(sqlContext, maps)
{
- BuildMap();
+ DefineMap(nameof(IdentityUserLogin.Id), nameof(ExternalLoginDto.Id));
+ DefineMap(nameof(IdentityUserLogin.CreateDate), nameof(ExternalLoginDto.CreateDate));
+ DefineMap(nameof(IdentityUserLogin.LoginProvider), nameof(ExternalLoginDto.LoginProvider));
+ DefineMap(nameof(IdentityUserLogin.ProviderKey), nameof(ExternalLoginDto.ProviderKey));
+ DefineMap(nameof(IdentityUserLogin.UserId), nameof(ExternalLoginDto.UserId));
}
-
- #region Overrides of BaseMapper
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
- {
- CacheMap(src => src.Id, dto => dto.Id);
- CacheMap(src => src.CreateDate, dto => dto.CreateDate);
- CacheMap(src => src.LoginProvider, dto => dto.LoginProvider);
- CacheMap(src => src.ProviderKey, dto => dto.ProviderKey);
- CacheMap(src => src.UserId, dto => dto.UserId);
- }
-
- #endregion
}
}
diff --git a/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs b/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs
index ea7d4c2f09..eeb89f9e7c 100644
--- a/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs
+++ b/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs
@@ -1,4 +1,5 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Dtos;
@@ -12,15 +13,12 @@ namespace Umbraco.Core.Persistence.Mappers
[MapperFor(typeof(Language))]
public sealed class LanguageMapper : BaseMapper
{
- private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary();
-
- internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance;
-
- protected override void BuildMap()
+ public LanguageMapper(ISqlContext sqlContext, ConcurrentDictionary