diff --git a/src/Umbraco.Core/Composing/Current.cs b/src/Umbraco.Core/Composing/Current.cs index 1b16ad2b8e..1b39429494 100644 --- a/src/Umbraco.Core/Composing/Current.cs +++ b/src/Umbraco.Core/Composing/Current.cs @@ -4,6 +4,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.Dictionary; using Umbraco.Core.IO; using Umbraco.Core.Logging; +using Umbraco.Core.Mapping; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PackageActions; using Umbraco.Core.Packaging; @@ -103,6 +104,9 @@ namespace Umbraco.Core.Composing #region Getters + public static Mapper Mapper + => _factory.GetInstance(); + public static IShortStringHelper ShortStringHelper => _shortStringHelper ?? (_shortStringHelper = _factory?.TryGetInstance() ?? new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(Configs.Settings()))); diff --git a/src/Umbraco.Core/Mapping/Mapper.cs b/src/Umbraco.Core/Mapping/Mapper.cs index 6d6637cf15..27b651f155 100644 --- a/src/Umbraco.Core/Mapping/Mapper.cs +++ b/src/Umbraco.Core/Mapping/Mapper.cs @@ -4,6 +4,11 @@ using System.Linq; namespace Umbraco.Core.Mapping { + // FIXME we should inject the mapper + // FIXME in order to transition, this should also handle AutoMapper? + // FIXME we might have to manage a 'context' for some contextual mappings? + // FIXME we have an infinite loop problem w/ logging in due to mapping issues + public class Mapper { private readonly Dictionary>> _maps = new Dictionary>>(); @@ -30,21 +35,64 @@ namespace Umbraco.Core.Mapping if (source == null) throw new ArgumentNullException(nameof(source)); - var sourceType = source.GetType(); - var targetType = typeof(TTarget); + var map = GetMap(source.GetType(), typeof(TTarget)); + if (map == null) + { + // fixme this is temp + //throw new InvalidOperationException($"Don't know how to map {sourceType.FullName} to {targetType.FullName}."); + return AutoMapper.Mapper.Map(source); + } + return (TTarget) map(source); + } + + private Func GetMap(Type sourceType, Type targetType) + { if (!_maps.TryGetValue(sourceType, out var sourceMap)) { var type = _maps.Keys.FirstOrDefault(x => x.IsAssignableFrom(sourceType)); if (type == null) - throw new InvalidOperationException($"Don't know how to map {sourceType.FullName} to {targetType.FullName}."); + return null; sourceMap = _maps[sourceType] = _maps[type]; } - if (!sourceMap.TryGetValue(targetType, out var map)) - throw new InvalidOperationException($"Don't know how to map {sourceType.FullName} to {targetType.FullName}."); + return sourceMap.TryGetValue(targetType, out var map) ? map : null; + } - return (TTarget) map(source); + public TTarget Map(TSource source) + { + return AutoMapper.Mapper.Map(source); + + var sourceType = typeof(TSource); + var targetType = typeof(TTarget); + + var map = GetMap(sourceType, targetType); + if (map != null) + return (TTarget) map(source); + + if (sourceType.IsGenericType && targetType.IsGenericType) + { + var sourceGeneric = sourceType.GetGenericTypeDefinition(); + var targetGeneric = targetType.GetGenericTypeDefinition(); + var ienumerable = typeof(IEnumerable<>); + + if (sourceGeneric == ienumerable && targetGeneric == ienumerable) + { + var sourceGenericType = sourceGeneric.GetGenericArguments()[0]; + var targetGenericType = targetGeneric.GetGenericArguments()[0]; + map = GetMap(sourceGenericType, targetGenericType); + // fixme - how can we enumerate, generically? + } + } + + // fixme this is temp + //throw new InvalidOperationException($"Don't know how to map {sourceType.FullName} to {targetType.FullName}."); + return AutoMapper.Mapper.Map(source); + } + + public TTarget Map(TSource source, TTarget target) + { + return AutoMapper.Mapper.Map(source, target); // fixme what does this do exactly? } } } diff --git a/src/Umbraco.Core/Runtime/CoreInitialComponent.cs b/src/Umbraco.Core/Runtime/CoreInitialComponent.cs index 20fee7a299..25b679b2a0 100644 --- a/src/Umbraco.Core/Runtime/CoreInitialComponent.cs +++ b/src/Umbraco.Core/Runtime/CoreInitialComponent.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Runtime { private readonly IEnumerable _mapperProfiles; - public CoreInitialComponent(IEnumerable mapperProfiles) + public CoreInitialComponent(IEnumerable mapperProfiles) // fixme - this is what we want to kill: mapper { _mapperProfiles = mapperProfiles; } diff --git a/src/Umbraco.Core/Security/BackOfficeUserStore.cs b/src/Umbraco.Core/Security/BackOfficeUserStore.cs index 0f186b2299..eb293df03d 100644 --- a/src/Umbraco.Core/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Core/Security/BackOfficeUserStore.cs @@ -21,7 +21,7 @@ using Task = System.Threading.Tasks.Task; namespace Umbraco.Core.Security { - public class BackOfficeUserStore : DisposableObjectSlim, + public class BackOfficeUserStore : DisposableObjectSlim, IUserStore, IUserPasswordStore, IUserEmailStore, @@ -42,9 +42,10 @@ namespace Umbraco.Core.Security private readonly IEntityService _entityService; private readonly IExternalLoginService _externalLoginService; private readonly IGlobalSettings _globalSettings; + private readonly Mapper _mapper; private bool _disposed = false; - public BackOfficeUserStore(IUserService userService, IMemberTypeService memberTypeService, IEntityService entityService, IExternalLoginService externalLoginService, IGlobalSettings globalSettings, MembershipProviderBase usersMembershipProvider) + public BackOfficeUserStore(IUserService userService, IMemberTypeService memberTypeService, IEntityService entityService, IExternalLoginService externalLoginService, IGlobalSettings globalSettings, MembershipProviderBase usersMembershipProvider, Mapper mapper) { _userService = userService; _memberTypeService = memberTypeService; @@ -54,6 +55,7 @@ namespace Umbraco.Core.Security if (userService == null) throw new ArgumentNullException("userService"); if (usersMembershipProvider == null) throw new ArgumentNullException("usersMembershipProvider"); if (externalLoginService == null) throw new ArgumentNullException("externalLoginService"); + _mapper = mapper; _userService = userService; _externalLoginService = externalLoginService; @@ -188,9 +190,7 @@ namespace Umbraco.Core.Security return null; } - var m = Composing.Current.Factory.GetInstance(); - //return await Task.FromResult(AssignLoginsCallback(Mapper.Map(user))); - return await Task.FromResult(AssignLoginsCallback(m.Map(user))); + return await Task.FromResult(AssignLoginsCallback(_mapper.Map(user))); } /// @@ -207,9 +207,7 @@ namespace Umbraco.Core.Security return null; } - var m = Composing.Current.Factory.GetInstance(); - //var result = AssignLoginsCallback(Mapper.Map(user)); - var result = AssignLoginsCallback(m.Map(user)); + var result = AssignLoginsCallback(_mapper.Map(user)); return await Task.FromResult(result); } @@ -318,12 +316,10 @@ namespace Umbraco.Core.Security public Task FindByEmailAsync(string email) { ThrowIfDisposed(); - var m = Composing.Current.Factory.GetInstance(); var user = _userService.GetByEmail(email); var result = user == null ? null - //: Mapper.Map(user); - : m.Map(user); + : _mapper.Map(user); return Task.FromResult(AssignLoginsCallback(result)); } @@ -400,9 +396,7 @@ namespace Umbraco.Core.Security var user = _userService.GetUserById(l.UserId); if (user != null) { - var m = Composing.Current.Factory.GetInstance(); - //output = Mapper.Map(user); - output = m.Map(user); + output = _mapper.Map(user); break; } } diff --git a/src/Umbraco.Web/Composing/Current.cs b/src/Umbraco.Web/Composing/Current.cs index 5dfd7251b8..8d6066a841 100644 --- a/src/Umbraco.Web/Composing/Current.cs +++ b/src/Umbraco.Web/Composing/Current.cs @@ -11,6 +11,7 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; +using Umbraco.Core.Mapping; using Umbraco.Core.PackageActions; using Umbraco.Core.Packaging; using Umbraco.Core.PropertyEditors; @@ -164,6 +165,8 @@ namespace Umbraco.Web.Composing // proxy Core for convenience + public static Mapper Mapper => CoreCurrent.Mapper; + public static IRuntimeState RuntimeState => CoreCurrent.RuntimeState; public static TypeLoader TypeLoader => CoreCurrent.TypeLoader; diff --git a/src/Umbraco.Web/Editors/AuthenticationController.cs b/src/Umbraco.Web/Editors/AuthenticationController.cs index 4f339a36fd..cafb85c3b4 100644 --- a/src/Umbraco.Web/Editors/AuthenticationController.cs +++ b/src/Umbraco.Web/Editors/AuthenticationController.cs @@ -8,14 +8,12 @@ using System.Threading.Tasks; using System.Web; using System.Web.Http; using System.Web.Mvc; -using AutoMapper; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Models; using Umbraco.Core.Models.Identity; -using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Web.Models; using Umbraco.Web.Models.ContentEditing; diff --git a/src/Umbraco.Web/Editors/CodeFileController.cs b/src/Umbraco.Web/Editors/CodeFileController.cs index bd6b837c2c..dad7376da8 100644 --- a/src/Umbraco.Web/Editors/CodeFileController.cs +++ b/src/Umbraco.Web/Editors/CodeFileController.cs @@ -1,5 +1,4 @@ using System; -using AutoMapper; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 12047b628b..fc9ceb82cd 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -9,7 +9,6 @@ using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Http.ModelBinding; using System.Web.Security; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; @@ -504,7 +503,7 @@ namespace Umbraco.Web.Editors var pagedResult = new PagedResult>(totalChildren, pageNumber, pageSize); pagedResult.Items = children.Select(content => - Mapper.Map>(content, + AutoMapper.Mapper.Map>(content, opts => { diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs index bf2ef62028..81172b3b97 100644 --- a/src/Umbraco.Web/Editors/ContentTypeController.cs +++ b/src/Umbraco.Web/Editors/ContentTypeController.cs @@ -1,5 +1,4 @@ -using AutoMapper; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs b/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs index e46f32746e..0fa3428740 100644 --- a/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs @@ -15,7 +15,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Services; -using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; diff --git a/src/Umbraco.Web/Editors/CurrentUserController.cs b/src/Umbraco.Web/Editors/CurrentUserController.cs index 30f3a431ad..3c8aed247e 100644 --- a/src/Umbraco.Web/Editors/CurrentUserController.cs +++ b/src/Umbraco.Web/Editors/CurrentUserController.cs @@ -1,12 +1,9 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; -using AutoMapper; -using Umbraco.Core.Composing; using Umbraco.Core.Services; using Umbraco.Web.Models; using Umbraco.Web.Models.ContentEditing; @@ -15,7 +12,6 @@ using Umbraco.Web.WebApi; using System.Linq; using Newtonsoft.Json; using Umbraco.Core; -using Umbraco.Core.Security; using Umbraco.Web.Security; using Umbraco.Web.WebApi.Filters; diff --git a/src/Umbraco.Web/Editors/DataTypeController.cs b/src/Umbraco.Web/Editors/DataTypeController.cs index e49754dff9..30c4162252 100644 --- a/src/Umbraco.Web/Editors/DataTypeController.cs +++ b/src/Umbraco.Web/Editors/DataTypeController.cs @@ -4,7 +4,6 @@ using System.Data; using System.Linq; using System.Net; using System.Web.Http; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; diff --git a/src/Umbraco.Web/Editors/DictionaryController.cs b/src/Umbraco.Web/Editors/DictionaryController.cs index 85ca00dd5b..120ebeded7 100644 --- a/src/Umbraco.Web/Editors/DictionaryController.cs +++ b/src/Umbraco.Web/Editors/DictionaryController.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index 2705fc531c..fa01fd943d 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -507,7 +507,7 @@ namespace Umbraco.Web.Editors var culture = ClientCulture(); var pagedResult = new PagedResult(totalRecords, pageNumber, pageSize) { - Items = entities.Select(entity => Mapper.Map(entity, options => + Items = entities.Select(entity => AutoMapper.Mapper.Map(entity, options => { options.SetCulture(culture); options.AfterMap((src, dest) => { dest.AdditionalData["hasChildren"] = src.HasChildren; }); @@ -1052,7 +1052,7 @@ namespace Umbraco.Web.Editors private EntityBasic MapEntity(object entity, string culture = null) { culture = culture ?? ClientCulture(); - return Mapper.Map(entity, opts => { opts.SetCulture(culture); }); + return AutoMapper.Mapper.Map(entity, opts => { opts.SetCulture(culture); }); } private string ClientCulture() => Request.ClientCulture(); diff --git a/src/Umbraco.Web/Editors/LanguageController.cs b/src/Umbraco.Web/Editors/LanguageController.cs index 64132d3d8e..c8304e6f3a 100644 --- a/src/Umbraco.Web/Editors/LanguageController.cs +++ b/src/Umbraco.Web/Editors/LanguageController.cs @@ -3,9 +3,7 @@ using System.Globalization; using System.Linq; using System.Net; using System.Net.Http; -using System.Threading; using System.Web.Http; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Web.Mvc; diff --git a/src/Umbraco.Web/Editors/LogController.cs b/src/Umbraco.Web/Editors/LogController.cs index 1cd7e79dc9..7639fd624c 100644 --- a/src/Umbraco.Web/Editors/LogController.cs +++ b/src/Umbraco.Web/Editors/LogController.cs @@ -1,8 +1,6 @@ -using AutoMapper; -using System; +using System; using System.Collections.Generic; using System.Linq; -using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Web.Models.ContentEditing; diff --git a/src/Umbraco.Web/Editors/MacroRenderingController.cs b/src/Umbraco.Web/Editors/MacroRenderingController.cs index 49b58416cd..a2bbfe1dfd 100644 --- a/src/Umbraco.Web/Editors/MacroRenderingController.cs +++ b/src/Umbraco.Web/Editors/MacroRenderingController.cs @@ -8,10 +8,8 @@ using System.Text; using System.Threading; using System.Web.Http; using System.Web.SessionState; -using AutoMapper; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; -using Umbraco.Web.Macros; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 1411e6aca4..b82fdd9773 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -8,7 +8,6 @@ using System.Text; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.ModelBinding; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.IO; using Umbraco.Core.Logging; diff --git a/src/Umbraco.Web/Editors/MediaTypeController.cs b/src/Umbraco.Web/Editors/MediaTypeController.cs index ce0b0d7653..391f3b8cf9 100644 --- a/src/Umbraco.Web/Editors/MediaTypeController.cs +++ b/src/Umbraco.Web/Editors/MediaTypeController.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using AutoMapper; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; @@ -12,7 +11,6 @@ using System.Net.Http; using Umbraco.Web.WebApi; using Umbraco.Core.Services; using System; -using System.ComponentModel; using System.Web.Http.Controllers; using Umbraco.Core; using Umbraco.Core.Cache; diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index fb4bddb08c..477dced7d0 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -5,12 +5,9 @@ using System.Net; using System.Net.Http; using System.Net.Http.Formatting; using System.Net.Http.Headers; -using System.Threading.Tasks; -using System.Web; using System.Web.Http; using System.Web.Http.ModelBinding; using System.Web.Security; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; @@ -19,7 +16,6 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Core.Services.Implement; -using Umbraco.Web.Models.Mapping; using Umbraco.Web.WebApi; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; diff --git a/src/Umbraco.Web/Editors/MemberGroupController.cs b/src/Umbraco.Web/Editors/MemberGroupController.cs index caf158f6de..67bd126e6e 100644 --- a/src/Umbraco.Web/Editors/MemberGroupController.cs +++ b/src/Umbraco.Web/Editors/MemberGroupController.cs @@ -4,7 +4,6 @@ using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Security; -using AutoMapper; using Umbraco.Core.Models; using Umbraco.Core.Security; using Umbraco.Core.Services; diff --git a/src/Umbraco.Web/Editors/MemberTypeController.cs b/src/Umbraco.Web/Editors/MemberTypeController.cs index 59a9af14c2..df7faeccf4 100644 --- a/src/Umbraco.Web/Editors/MemberTypeController.cs +++ b/src/Umbraco.Web/Editors/MemberTypeController.cs @@ -5,7 +5,6 @@ using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Security; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; diff --git a/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs b/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs index 04a19ec437..ec55a50c0a 100644 --- a/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs +++ b/src/Umbraco.Web/Editors/RedirectUrlManagementController.cs @@ -4,8 +4,6 @@ using System.Xml; using System.Collections.Generic; using System.Linq; using System.Security; -using AutoMapper; -using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; diff --git a/src/Umbraco.Web/Editors/RelationController.cs b/src/Umbraco.Web/Editors/RelationController.cs index 430f1af690..bbb6b3f26f 100644 --- a/src/Umbraco.Web/Editors/RelationController.cs +++ b/src/Umbraco.Web/Editors/RelationController.cs @@ -3,7 +3,6 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Web.Models.ContentEditing; diff --git a/src/Umbraco.Web/Editors/RelationTypeController.cs b/src/Umbraco.Web/Editors/RelationTypeController.cs index f0f4a440c7..0d6b128f2c 100644 --- a/src/Umbraco.Web/Editors/RelationTypeController.cs +++ b/src/Umbraco.Web/Editors/RelationTypeController.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Web.Http; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; diff --git a/src/Umbraco.Web/Editors/SectionController.cs b/src/Umbraco.Web/Editors/SectionController.cs index 6d6a3bb987..ac98f576d4 100644 --- a/src/Umbraco.Web/Editors/SectionController.cs +++ b/src/Umbraco.Web/Editors/SectionController.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using AutoMapper; using Umbraco.Web.Mvc; using System.Linq; using Umbraco.Core; diff --git a/src/Umbraco.Web/Editors/TemplateController.cs b/src/Umbraco.Web/Editors/TemplateController.cs index e1b86c62ea..8da5e80f2e 100644 --- a/src/Umbraco.Web/Editors/TemplateController.cs +++ b/src/Umbraco.Web/Editors/TemplateController.cs @@ -1,5 +1,4 @@ -using AutoMapper; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; diff --git a/src/Umbraco.Web/Editors/UserGroupsController.cs b/src/Umbraco.Web/Editors/UserGroupsController.cs index c8f7d2b0df..54253d936e 100644 --- a/src/Umbraco.Web/Editors/UserGroupsController.cs +++ b/src/Umbraco.Web/Editors/UserGroupsController.cs @@ -4,8 +4,6 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; -using System.Web.Http.Filters; -using AutoMapper; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index 8b618afde5..a97bc6e0df 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -8,9 +8,7 @@ using System.Runtime.Serialization; using System.Threading.Tasks; using System.Web; using System.Web.Http; -using System.Web.Http.Controllers; using System.Web.Mvc; -using AutoMapper; using Microsoft.AspNet.Identity; using Umbraco.Core; using Umbraco.Core.Cache; @@ -24,7 +22,6 @@ using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; -using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Web.Editors.Filters; @@ -32,7 +29,6 @@ using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; -using ActionFilterAttribute = System.Web.Http.Filters.ActionFilterAttribute; using Constants = Umbraco.Core.Constants; using IUser = Umbraco.Core.Models.Membership.IUser; using Task = System.Threading.Tasks.Task; diff --git a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs b/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs index 5e9beeff29..4b38a1c63c 100644 --- a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs +++ b/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs @@ -1,19 +1,16 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using System.Text; using System.Text.RegularExpressions; -using AutoMapper; using Examine; using Umbraco.Core; -using Umbraco.Core.Composing; +using Umbraco.Core.Mapping; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Examine; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Trees; -using SearchResult = Examine.SearchResult; namespace Umbraco.Web.Search { @@ -24,21 +21,21 @@ namespace Umbraco.Web.Search { private readonly IExamineManager _examineManager; private readonly UmbracoContext _umbracoContext; - private readonly UmbracoHelper _umbracoHelper; private readonly ILocalizationService _languageService; private readonly IEntityService _entityService; + private readonly Mapper _mapper; public UmbracoTreeSearcher(IExamineManager examineManager, UmbracoContext umbracoContext, - UmbracoHelper umbracoHelper, ILocalizationService languageService, - IEntityService entityService) + IEntityService entityService, + Mapper mapper) { _examineManager = examineManager ?? throw new ArgumentNullException(nameof(examineManager)); _umbracoContext = umbracoContext; - _umbracoHelper = umbracoHelper ?? throw new ArgumentNullException(nameof(umbracoHelper)); _languageService = languageService; _entityService = entityService; + _mapper = mapper; } /// @@ -64,9 +61,9 @@ namespace Umbraco.Web.Search string type; var indexName = Constants.UmbracoIndexes.InternalIndexName; var fields = new[] { "id", "__NodeId" }; - + // TODO: WE should try to allow passing in a lucene raw query, however we will still need to do some manual string - // manipulation for things like start paths, member types, etc... + // manipulation for things like start paths, member types, etc... //if (Examine.ExamineExtensions.TryParseLuceneQuery(query)) //{ @@ -201,7 +198,7 @@ namespace Umbraco.Web.Search AppendNodeNameExactWithBoost(sb, query, allLangs); AppendNodeNameWithWildcards(sb, querywords, allLangs); - + foreach (var f in fields) { //additional fields normally @@ -356,14 +353,14 @@ namespace Umbraco.Web.Search //add additional data foreach (var result in results) { - var m = Mapper.Map(result); + var m = _mapper.Map(result); //if no icon could be mapped, it will be set to document, so change it to picture if (m.Icon == "icon-document") { m.Icon = "icon-user"; } - + if (result.Values.ContainsKey("email") && result.Values["email"] != null) { m.AdditionalData["Email"] = result.Values["email"]; @@ -390,7 +387,7 @@ namespace Umbraco.Web.Search //add additional data foreach (var result in results) { - var m = Mapper.Map(result); + var m = _mapper.Map(result); //if no icon could be mapped, it will be set to document, so change it to picture if (m.Icon == "icon-document") { @@ -411,7 +408,7 @@ namespace Umbraco.Web.Search foreach (var result in results) { - var entity = Mapper.Map(result); + var entity = _mapper.Map(result); var intId = entity.Id.TryConvertTo(); if (intId.Success) diff --git a/src/Umbraco.Web/Security/AppBuilderExtensions.cs b/src/Umbraco.Web/Security/AppBuilderExtensions.cs index 22d87bdc14..751bc427b6 100644 --- a/src/Umbraco.Web/Security/AppBuilderExtensions.cs +++ b/src/Umbraco.Web/Security/AppBuilderExtensions.cs @@ -13,6 +13,7 @@ using Owin; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Mapping; using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; using Umbraco.Core.Services; @@ -36,6 +37,7 @@ namespace Umbraco.Web.Security /// public static void ConfigureUserManagerForUmbracoBackOffice(this IAppBuilder app, ServiceContext services, + Mapper mapper, IContentSection contentSettings, IGlobalSettings globalSettings, MembershipProviderBase userMembershipProvider) @@ -52,6 +54,7 @@ namespace Umbraco.Web.Security services.EntityService, services.ExternalLoginService, userMembershipProvider, + mapper, contentSettings, globalSettings)); diff --git a/src/Umbraco.Web/Security/BackOfficeUserManager.cs b/src/Umbraco.Web/Security/BackOfficeUserManager.cs index 83cf06c6d9..8874a38494 100644 --- a/src/Umbraco.Web/Security/BackOfficeUserManager.cs +++ b/src/Umbraco.Web/Security/BackOfficeUserManager.cs @@ -10,6 +10,7 @@ using Microsoft.Owin.Security.DataProtection; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Mapping; using Umbraco.Core.Models.Identity; using Umbraco.Core.Security; using Umbraco.Core.Services; @@ -60,6 +61,7 @@ namespace Umbraco.Web.Security IEntityService entityService, IExternalLoginService externalLoginService, MembershipProviderBase membershipProvider, + Mapper mapper, IContentSection contentSectionConfig, IGlobalSettings globalSettings) { @@ -69,7 +71,7 @@ namespace Umbraco.Web.Security if (externalLoginService == null) throw new ArgumentNullException("externalLoginService"); var manager = new BackOfficeUserManager( - new BackOfficeUserStore(userService, memberTypeService, entityService, externalLoginService, globalSettings, membershipProvider)); + new BackOfficeUserStore(userService, memberTypeService, entityService, externalLoginService, globalSettings, membershipProvider, mapper)); manager.InitUserManager(manager, membershipProvider, contentSectionConfig, options); return manager; } diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index 66cb9fe36e..9b58fe09fa 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -1,10 +1,8 @@ -using AutoMapper; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Http.Formatting; using Umbraco.Core; -using Umbraco.Core.Composing; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; using Umbraco.Web.Actions; diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs index 8a0a83d94f..3b1d025079 100644 --- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Net.Http.Formatting; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs index 30db2ea12a..faa52b038b 100644 --- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs @@ -2,9 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Net.Http.Formatting; -using AutoMapper; using Umbraco.Core; -using Umbraco.Core.Composing; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; using Umbraco.Web.Models.Trees; diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index 916e5d4b4d..35aa70b193 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net.Http.Formatting; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.Entities; diff --git a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs index 2651167a6b..43c571035a 100644 --- a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs +++ b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs @@ -4,6 +4,7 @@ using Owin; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Mapping; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Web; @@ -28,6 +29,7 @@ namespace Umbraco.Web protected IUmbracoSettingsSection UmbracoSettings => Current.Configs.Settings(); protected IRuntimeState RuntimeState => Core.Composing.Current.RuntimeState; protected ServiceContext Services => Current.Services; + protected Mapper Mapper => Current.Mapper; /// /// Main startup method @@ -80,6 +82,7 @@ namespace Umbraco.Web // (EXPERT: an overload accepts a custom BackOfficeUserStore implementation) app.ConfigureUserManagerForUmbracoBackOffice( Services, + Mapper, UmbracoSettings.Content, GlobalSettings, Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider().AsUmbracoMembershipProvider()); diff --git a/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs b/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs index 3cfbd5a314..46b6fd9d03 100644 --- a/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs +++ b/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs @@ -4,16 +4,13 @@ using System.Threading; using System.Threading.Tasks; using System.Web.Http.Controllers; using System.Web.Http.Filters; -using AutoMapper; using Umbraco.Core; using Umbraco.Core.Composing; -using Umbraco.Core.Configuration; -using Umbraco.Core.Mapping; using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; using Umbraco.Core.Security; using Umbraco.Web.Security; -using Mapper = Umbraco.Core.Mapping.Mapper; +using Umbraco.Core.Mapping; using UserExtensions = Umbraco.Core.Models.UserExtensions; namespace Umbraco.Web.WebApi.Filters @@ -28,6 +25,9 @@ namespace Umbraco.Web.WebApi.Filters /// public sealed class CheckIfUserTicketDataIsStaleAttribute : ActionFilterAttribute { + // this is an attribute - no choice + private Mapper Mapper => Current.Mapper; + public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { await CheckStaleData(actionContext); @@ -114,9 +114,7 @@ namespace Umbraco.Web.WebApi.Filters { var signInManager = owinCtx.Result.GetBackOfficeSignInManager(); - var m = Composing.Current.Factory.GetInstance(); - //var backOfficeIdentityUser = Mapper.Map(user); - var backOfficeIdentityUser = m.Map(user); + var backOfficeIdentityUser = Mapper.Map(user); await signInManager.SignInAsync(backOfficeIdentityUser, isPersistent: true, rememberBrowser: false); //ensure the remainder of the request has the correct principal set diff --git a/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs b/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs index 16ca2e5642..73f119d3ae 100644 --- a/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs +++ b/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs @@ -7,6 +7,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; +using Umbraco.Core.Mapping; using Umbraco.Core.Persistence; using Umbraco.Core.Services; using Umbraco.Web.Security; @@ -56,6 +57,9 @@ namespace Umbraco.Web.WebApi Logger = logger; RuntimeState = runtimeState; Umbraco = umbracoHelper; + + // fixme - can we break all ctors? + Mapper = Current.Mapper; } /// @@ -120,6 +124,11 @@ namespace Umbraco.Web.WebApi /// public UmbracoHelper Umbraco { get; } + /// + /// Gets the mapper. + /// + public Mapper Mapper { get; } + /// /// Gets the web security helper. ///