From 75d218d2e3b69527a72425df44a6b6ef120bbf8d Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Wed, 13 Mar 2013 01:09:29 +0400 Subject: [PATCH] Updated how mappers for persistence work with the MapperFor attribute and have made BaseMapper public but have kept all properties, etc.. internal just so that they can be found so we don't have to register them. Updates unit test to ensure the plugin manager is init'd properly with the 'false' override. Ensures that the base db test also initializes the plugin manager properly. --- src/Umbraco.Core/CoreBootManager.cs | 3 ++ src/Umbraco.Core/Models/Content.cs | 1 - src/Umbraco.Core/Models/ContentType.cs | 1 - src/Umbraco.Core/Models/DataTypeDefinition.cs | 1 - src/Umbraco.Core/Models/DictionaryItem.cs | 1 - .../Models/DictionaryTranslation.cs | 1 - src/Umbraco.Core/Models/IContent.cs | 1 - src/Umbraco.Core/Models/IContentType.cs | 1 - .../Models/IDataTypeDefinition.cs | 1 - src/Umbraco.Core/Models/IDictionaryItem.cs | 1 - .../Models/IDictionaryTranslation.cs | 1 - src/Umbraco.Core/Models/ILanguage.cs | 1 - src/Umbraco.Core/Models/IMedia.cs | 1 - src/Umbraco.Core/Models/IMediaType.cs | 3 +- src/Umbraco.Core/Models/Language.cs | 1 - src/Umbraco.Core/Models/Media.cs | 1 - src/Umbraco.Core/Models/MediaType.cs | 1 - src/Umbraco.Core/Models/Membership/IUser.cs | 1 - .../Models/Membership/IUserType.cs | 2 +- src/Umbraco.Core/Models/Membership/User.cs | 1 - .../Models/Membership/UserType.cs | 1 - src/Umbraco.Core/Models/Property.cs | 1 - src/Umbraco.Core/Models/PropertyGroup.cs | 1 - src/Umbraco.Core/Models/PropertyType.cs | 1 - src/Umbraco.Core/Models/Relation.cs | 1 - src/Umbraco.Core/Models/RelationType.cs | 1 - src/Umbraco.Core/Models/ServerRegistration.cs | 1 - .../Persistence/Mappers/BaseMapper.cs | 2 +- .../Persistence/Mappers/ContentMapper.cs | 4 +- .../Persistence/Mappers/ContentTypeMapper.cs | 4 +- .../Mappers/DataTypeDefinitionMapper.cs | 4 +- .../Persistence/Mappers/DictionaryMapper.cs | 4 +- .../Mappers/DictionaryTranslationMapper.cs | 4 +- .../Persistence/Mappers/LanguageMapper.cs | 4 +- .../Persistence/Mappers/MapperForAttribute.cs | 19 ++++++++ .../Persistence/Mappers/MappingResolver.cs | 47 ++++++++++++++----- .../Persistence/Mappers/MediaMapper.cs | 5 +- .../Persistence/Mappers/MediaTypeMapper.cs | 4 +- .../Mappers/PropertyGroupMapper.cs | 3 +- .../Persistence/Mappers/PropertyMapper.cs | 3 +- .../Persistence/Mappers/PropertyTypeMapper.cs | 3 +- .../Persistence/Mappers/RelationMapper.cs | 3 +- .../Persistence/Mappers/RelationTypeMapper.cs | 3 +- .../Mappers/ServerRegistrationMapper.cs | 3 +- .../Persistence/Mappers/UserMapper.cs | 4 +- .../Persistence/Mappers/UserTypeMapper.cs | 4 +- .../Querying/ModelToSqlExpressionHelper.cs | 2 +- src/Umbraco.Core/PluginManager.cs | 10 ++++ src/Umbraco.Core/Umbraco.Core.csproj | 2 +- src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs | 2 +- src/Umbraco.Tests/Models/ContentXmlTest.cs | 2 +- src/Umbraco.Tests/Models/MediaXmlTest.cs | 2 +- .../Mappers/MappingResolverTests.cs | 21 +++++++-- .../Repositories/ContentRepositoryTest.cs | 2 +- .../Repositories/MediaRepositoryTest.cs | 2 +- .../Repositories/RelationRepositoryTest.cs | 2 +- src/Umbraco.Tests/PluginManagerTests.cs | 7 +++ .../Publishing/PublishingStrategyTests.cs | 2 +- .../Routing/RenderRouteHandlerTests.cs | 2 +- src/Umbraco.Tests/Services/BaseServiceTest.cs | 2 +- .../Services/ThreadSafetyServiceTest.cs | 2 +- .../TestHelpers/BaseDatabaseFactoryTest.cs | 10 +++- .../TestHelpers/BaseUsingSqlCeSyntax.cs | 29 ++++++++++++ 63 files changed, 186 insertions(+), 74 deletions(-) create mode 100644 src/Umbraco.Core/Persistence/Mappers/MapperForAttribute.cs diff --git a/src/Umbraco.Core/CoreBootManager.cs b/src/Umbraco.Core/CoreBootManager.cs index 18deba3b0a..11ee5b4eab 100644 --- a/src/Umbraco.Core/CoreBootManager.cs +++ b/src/Umbraco.Core/CoreBootManager.cs @@ -196,6 +196,9 @@ namespace Umbraco.Core ServerMessengerResolver.Current = new ServerMessengerResolver( new DefaultServerMessenger()); + MappingResolver.Current = new MappingResolver( + () => PluginManager.Current.ResolveAssignedMapperTypes()); + RepositoryResolver.Current = new RepositoryResolver( new RepositoryFactory()); diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index 10c28f0329..d7a6cfd0a4 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -12,7 +12,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(ContentMapper))] public class Content : ContentBase, IContent { private IContentType _contentType; diff --git a/src/Umbraco.Core/Models/ContentType.cs b/src/Umbraco.Core/Models/ContentType.cs index 33d38fb108..f10e939489 100644 --- a/src/Umbraco.Core/Models/ContentType.cs +++ b/src/Umbraco.Core/Models/ContentType.cs @@ -12,7 +12,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(ContentTypeMapper))] public class ContentType : ContentTypeCompositionBase, IContentType { private int _defaultTemplate; diff --git a/src/Umbraco.Core/Models/DataTypeDefinition.cs b/src/Umbraco.Core/Models/DataTypeDefinition.cs index dde0f7ee84..7d42a7e6b4 100644 --- a/src/Umbraco.Core/Models/DataTypeDefinition.cs +++ b/src/Umbraco.Core/Models/DataTypeDefinition.cs @@ -15,7 +15,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(DataTypeDefinitionMapper))] public class DataTypeDefinition : Entity, IDataTypeDefinition { private int _parentId; diff --git a/src/Umbraco.Core/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs index dd9742a485..77fda51466 100644 --- a/src/Umbraco.Core/Models/DictionaryItem.cs +++ b/src/Umbraco.Core/Models/DictionaryItem.cs @@ -12,7 +12,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(DictionaryMapper))] public class DictionaryItem : Entity, IDictionaryItem { private Guid _parentId; diff --git a/src/Umbraco.Core/Models/DictionaryTranslation.cs b/src/Umbraco.Core/Models/DictionaryTranslation.cs index 4be6ea58e6..532d762cd3 100644 --- a/src/Umbraco.Core/Models/DictionaryTranslation.cs +++ b/src/Umbraco.Core/Models/DictionaryTranslation.cs @@ -11,7 +11,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(DictionaryTranslationMapper))] public class DictionaryTranslation : Entity, IDictionaryTranslation { private ILanguage _language; diff --git a/src/Umbraco.Core/Models/IContent.cs b/src/Umbraco.Core/Models/IContent.cs index 25506b622b..c77ff8bbdb 100644 --- a/src/Umbraco.Core/Models/IContent.cs +++ b/src/Umbraco.Core/Models/IContent.cs @@ -7,7 +7,6 @@ namespace Umbraco.Core.Models /// /// Defines a Content object /// - [Mapper(typeof(ContentMapper))] public interface IContent : IContentBase { /// diff --git a/src/Umbraco.Core/Models/IContentType.cs b/src/Umbraco.Core/Models/IContentType.cs index ea084d7a40..c8cba83a37 100644 --- a/src/Umbraco.Core/Models/IContentType.cs +++ b/src/Umbraco.Core/Models/IContentType.cs @@ -6,7 +6,6 @@ namespace Umbraco.Core.Models /// /// Defines a ContentType, which Content is based on /// - [Mapper(typeof(ContentTypeMapper))] public interface IContentType : IContentTypeComposition { /// diff --git a/src/Umbraco.Core/Models/IDataTypeDefinition.cs b/src/Umbraco.Core/Models/IDataTypeDefinition.cs index 277ff4a7e3..5f0299e24b 100644 --- a/src/Umbraco.Core/Models/IDataTypeDefinition.cs +++ b/src/Umbraco.Core/Models/IDataTypeDefinition.cs @@ -4,7 +4,6 @@ using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models { - [Mapper(typeof(DataTypeDefinitionMapper))] public interface IDataTypeDefinition : IUmbracoEntity { /// diff --git a/src/Umbraco.Core/Models/IDictionaryItem.cs b/src/Umbraco.Core/Models/IDictionaryItem.cs index eb2e6bd6f8..4f457e97a4 100644 --- a/src/Umbraco.Core/Models/IDictionaryItem.cs +++ b/src/Umbraco.Core/Models/IDictionaryItem.cs @@ -6,7 +6,6 @@ using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models { - [Mapper(typeof(DictionaryMapper))] public interface IDictionaryItem : IAggregateRoot { /// diff --git a/src/Umbraco.Core/Models/IDictionaryTranslation.cs b/src/Umbraco.Core/Models/IDictionaryTranslation.cs index 1ae07486ea..cf813bf72f 100644 --- a/src/Umbraco.Core/Models/IDictionaryTranslation.cs +++ b/src/Umbraco.Core/Models/IDictionaryTranslation.cs @@ -4,7 +4,6 @@ using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models { - [Mapper(typeof(DictionaryTranslationMapper))] public interface IDictionaryTranslation : IEntity { /// diff --git a/src/Umbraco.Core/Models/ILanguage.cs b/src/Umbraco.Core/Models/ILanguage.cs index 0b6e3cea93..cab97c7eb7 100644 --- a/src/Umbraco.Core/Models/ILanguage.cs +++ b/src/Umbraco.Core/Models/ILanguage.cs @@ -5,7 +5,6 @@ using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models { - [Mapper(typeof(LanguageMapper))] public interface ILanguage : IAggregateRoot { /// diff --git a/src/Umbraco.Core/Models/IMedia.cs b/src/Umbraco.Core/Models/IMedia.cs index 7bd35d6f64..755d99eddb 100644 --- a/src/Umbraco.Core/Models/IMedia.cs +++ b/src/Umbraco.Core/Models/IMedia.cs @@ -2,7 +2,6 @@ namespace Umbraco.Core.Models { - [Mapper(typeof(MediaMapper))] public interface IMedia : IContentBase { /// diff --git a/src/Umbraco.Core/Models/IMediaType.cs b/src/Umbraco.Core/Models/IMediaType.cs index 7ec7329537..3934d7a40f 100644 --- a/src/Umbraco.Core/Models/IMediaType.cs +++ b/src/Umbraco.Core/Models/IMediaType.cs @@ -4,8 +4,7 @@ namespace Umbraco.Core.Models { /// /// Defines a ContentType, which Media is based on - /// - [Mapper(typeof(MediaTypeMapper))] + /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(LanguageMapper))] public class Language : Entity, ILanguage { private string _isoCode; diff --git a/src/Umbraco.Core/Models/Media.cs b/src/Umbraco.Core/Models/Media.cs index a30ec79d7c..4f922d28cf 100644 --- a/src/Umbraco.Core/Models/Media.cs +++ b/src/Umbraco.Core/Models/Media.cs @@ -9,7 +9,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(MediaMapper))] public class Media : ContentBase, IMedia { private IMediaType _contentType; diff --git a/src/Umbraco.Core/Models/MediaType.cs b/src/Umbraco.Core/Models/MediaType.cs index e505ead334..0fb4bd171b 100644 --- a/src/Umbraco.Core/Models/MediaType.cs +++ b/src/Umbraco.Core/Models/MediaType.cs @@ -9,7 +9,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(MediaTypeMapper))] public class MediaType : ContentTypeCompositionBase, IMediaType { public MediaType(int parentId) : base(parentId) diff --git a/src/Umbraco.Core/Models/Membership/IUser.cs b/src/Umbraco.Core/Models/Membership/IUser.cs index c43cd4ca59..005720007d 100644 --- a/src/Umbraco.Core/Models/Membership/IUser.cs +++ b/src/Umbraco.Core/Models/Membership/IUser.cs @@ -7,7 +7,6 @@ namespace Umbraco.Core.Models.Membership /// Defines the interface for a /// /// Will be left internal until a proper Membership implementation is part of the roadmap - [Mapper(typeof(UserMapper))] internal interface IUser : IMembershipUser { string Name { get; set; } diff --git a/src/Umbraco.Core/Models/Membership/IUserType.cs b/src/Umbraco.Core/Models/Membership/IUserType.cs index 7af8c104f7..aa837bf890 100644 --- a/src/Umbraco.Core/Models/Membership/IUserType.cs +++ b/src/Umbraco.Core/Models/Membership/IUserType.cs @@ -3,7 +3,7 @@ using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models.Membership { - [Mapper(typeof(UserTypeMapper))] + internal interface IUserType : IAggregateRoot { string Alias { get; set; } diff --git a/src/Umbraco.Core/Models/Membership/User.cs b/src/Umbraco.Core/Models/Membership/User.cs index 371c621d51..95c81abdc7 100644 --- a/src/Umbraco.Core/Models/Membership/User.cs +++ b/src/Umbraco.Core/Models/Membership/User.cs @@ -16,7 +16,6 @@ namespace Umbraco.Core.Models.Membership /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(UserMapper))] internal class User : UserProfile, IUser { private bool _hasIdentity; diff --git a/src/Umbraco.Core/Models/Membership/UserType.cs b/src/Umbraco.Core/Models/Membership/UserType.cs index be90dfa7e8..b09a568c22 100644 --- a/src/Umbraco.Core/Models/Membership/UserType.cs +++ b/src/Umbraco.Core/Models/Membership/UserType.cs @@ -14,7 +14,6 @@ namespace Umbraco.Core.Models.Membership /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(UserTypeMapper))] internal class UserType : Entity, IUserType { [DataMember] diff --git a/src/Umbraco.Core/Models/Property.cs b/src/Umbraco.Core/Models/Property.cs index 62895090d2..7ac301f807 100644 --- a/src/Umbraco.Core/Models/Property.cs +++ b/src/Umbraco.Core/Models/Property.cs @@ -11,7 +11,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(PropertyMapper))] public class Property : Entity { private readonly PropertyType _propertyType; diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs index ec78be87af..395d0b7992 100644 --- a/src/Umbraco.Core/Models/PropertyGroup.cs +++ b/src/Umbraco.Core/Models/PropertyGroup.cs @@ -12,7 +12,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(PropertyGroupMapper))] public class PropertyGroup : Entity, IEquatable { private string _name; diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs index abb62ce54f..b670693519 100644 --- a/src/Umbraco.Core/Models/PropertyType.cs +++ b/src/Umbraco.Core/Models/PropertyType.cs @@ -12,7 +12,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(PropertyTypeMapper))] public class PropertyType : Entity, IEquatable { //private SerializationService _service; diff --git a/src/Umbraco.Core/Models/Relation.cs b/src/Umbraco.Core/Models/Relation.cs index 5ecb372c2b..2dc1bd877e 100644 --- a/src/Umbraco.Core/Models/Relation.cs +++ b/src/Umbraco.Core/Models/Relation.cs @@ -11,7 +11,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(RelationMapper))] public class Relation : Entity, IAggregateRoot { //NOTE: The datetime column from umbracoRelation is set on CreateDate on the Entity diff --git a/src/Umbraco.Core/Models/RelationType.cs b/src/Umbraco.Core/Models/RelationType.cs index bb420286dd..e7f9dcbd76 100644 --- a/src/Umbraco.Core/Models/RelationType.cs +++ b/src/Umbraco.Core/Models/RelationType.cs @@ -11,7 +11,6 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [Mapper(typeof(RelationTypeMapper))] public class RelationType : Entity, IAggregateRoot { private string _name; diff --git a/src/Umbraco.Core/Models/ServerRegistration.cs b/src/Umbraco.Core/Models/ServerRegistration.cs index 49770485b5..32282b4f79 100644 --- a/src/Umbraco.Core/Models/ServerRegistration.cs +++ b/src/Umbraco.Core/Models/ServerRegistration.cs @@ -5,7 +5,6 @@ using Umbraco.Core.Sync; namespace Umbraco.Core.Models { - [Mapper(typeof(ServerRegistrationMapper))] internal class ServerRegistration : Entity, IServerAddress, IAggregateRoot { public ServerRegistration() diff --git a/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs b/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs index 76ac6af949..a5e1700566 100644 --- a/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/BaseMapper.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Mappers { - internal abstract class BaseMapper + public abstract class BaseMapper { internal abstract void BuildMap(); diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs index 34023400be..3c96d9d60d 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ContentMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class ContentMapper : BaseMapper + [MapperFor(typeof(Content))] + [MapperFor(typeof(IContent))] + public sealed class ContentMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs index fb1f4e89ca..c15b0a09fd 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ContentTypeMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class ContentTypeMapper : BaseMapper + [MapperFor(typeof(ContentType))] + [MapperFor(typeof(IContentType))] + public sealed class ContentTypeMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/DataTypeDefinitionMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DataTypeDefinitionMapper.cs index 69bb08afb5..27cd0e08c9 100644 --- a/src/Umbraco.Core/Persistence/Mappers/DataTypeDefinitionMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/DataTypeDefinitionMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class DataTypeDefinitionMapper : BaseMapper + [MapperFor(typeof(DataTypeDefinition))] + [MapperFor(typeof(IDataTypeDefinition))] + public sealed class DataTypeDefinitionMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs index 459704e63d..55b7246c3f 100644 --- a/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/DictionaryMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class DictionaryMapper : BaseMapper + [MapperFor(typeof(DictionaryItem))] + [MapperFor(typeof(IDictionaryItem))] + public sealed class DictionaryMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs index ef45899595..be42a5bbb2 100644 --- a/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/DictionaryTranslationMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal class DictionaryTranslationMapper : BaseMapper + [MapperFor(typeof(DictionaryTranslation))] + [MapperFor(typeof(IDictionaryTranslation))] + public class DictionaryTranslationMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs b/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs index 289decec4e..99ffe4fb6c 100644 --- a/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/LanguageMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class LanguageMapper : BaseMapper + [MapperFor(typeof(ILanguage))] + [MapperFor(typeof(Language))] + public sealed class LanguageMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/MapperForAttribute.cs b/src/Umbraco.Core/Persistence/Mappers/MapperForAttribute.cs new file mode 100644 index 0000000000..44ee135b07 --- /dev/null +++ b/src/Umbraco.Core/Persistence/Mappers/MapperForAttribute.cs @@ -0,0 +1,19 @@ +using System; + +namespace Umbraco.Core.Persistence.Mappers +{ + /// + /// An attribute used to decorate mappers to be associated with entities + /// + [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] + internal sealed class MapperForAttribute : Attribute + { + public Type EntityType { get; private set; } + + public MapperForAttribute(Type entityType) + { + EntityType = entityType; + } + } + +} \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs b/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs index abb220a66c..9fa1846629 100644 --- a/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs +++ b/src/Umbraco.Core/Persistence/Mappers/MappingResolver.cs @@ -1,29 +1,41 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; +using Umbraco.Core.ObjectResolution; namespace Umbraco.Core.Persistence.Mappers { - internal static class MappingResolver + internal class MappingResolver : LazyManyObjectsResolverBase { + /// + /// Constructor accepting a list of BaseMapper types that are attributed with the MapperFor attribute + /// + /// + public MappingResolver(Func> assignedMapperTypes) + : base(assignedMapperTypes) + { + + } + /// /// Caches the type -> mapper so that we don't have to type check each time we want one or lookup the attribute /// - private static readonly ConcurrentDictionary MapperCache = new ConcurrentDictionary(); + private readonly ConcurrentDictionary _mapperCache = new ConcurrentDictionary(); /// /// Return a mapper by type /// /// /// - internal static BaseMapper ResolveMapperByType(Type type) + internal BaseMapper ResolveMapperByType(Type type) { - return MapperCache.GetOrAdd(type, type1 => + return _mapperCache.GetOrAdd(type, type1 => { - var mappers = TypeFinder.FindClassesOfTypeWithAttribute(); - + //first check if we can resolve it by attribute var byAttribute = TryGetMapperByAttribute(type); @@ -43,30 +55,37 @@ namespace Umbraco.Core.Persistence.Mappers /// /// Check the entity type to see if it has a mapper attribute assigned and try to instantiate it /// - /// + /// /// - private static Attempt TryGetMapperByAttribute(Type type) + private Attempt TryGetMapperByAttribute(Type entityType) { - var attribute = type.GetCustomAttribute(false); - if (attribute == null) + //get all BaseMapper types that have a MapperFor attribute: + var assignedMapperTypes = InstanceTypes; + + //check if any of the mappers are assigned to this type + var mapper = assignedMapperTypes.FirstOrDefault( + x => x.GetCustomAttributes(false) + .Any(m => m.EntityType == entityType)); + + if (mapper == null) { return Attempt.False; } try { - var instance = Activator.CreateInstance(attribute.MapperType) as BaseMapper; + var instance = Activator.CreateInstance(mapper) as BaseMapper; return instance != null ? new Attempt(true, instance) : Attempt.False; } catch (Exception ex) { - LogHelper.Error(typeof(MappingResolver), "Could not instantiate mapper of type " + attribute.MapperType, ex); + LogHelper.Error(typeof(MappingResolver), "Could not instantiate mapper of type " + mapper, ex); return new Attempt(ex); } } - internal static string GetMapping(Type type, string propertyName) + internal string GetMapping(Type type, string propertyName) { var mapper = ResolveMapperByType(type); var result = mapper.Map(propertyName); @@ -75,5 +94,7 @@ namespace Umbraco.Core.Persistence.Mappers return result; } + } + } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Mappers/MediaMapper.cs b/src/Umbraco.Core/Persistence/Mappers/MediaMapper.cs index 8f28ac1ec5..7c8612164e 100644 --- a/src/Umbraco.Core/Persistence/Mappers/MediaMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/MediaMapper.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Linq.Expressions; +using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; namespace Umbraco.Core.Persistence.Mappers @@ -9,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class MediaMapper : BaseMapper + [MapperFor(typeof(IMedia))] + [MapperFor(typeof(Umbraco.Core.Models.Media))] + public sealed class MediaMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/MediaTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/MediaTypeMapper.cs index 245d8dca76..dd412edfd0 100644 --- a/src/Umbraco.Core/Persistence/Mappers/MediaTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/MediaTypeMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class MediaTypeMapper : BaseMapper + [MapperFor(typeof(IMediaType))] + [MapperFor(typeof(MediaType))] + public sealed class MediaTypeMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs b/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs index a43de4e1c4..241da5bbe0 100644 --- a/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/PropertyGroupMapper.cs @@ -10,7 +10,8 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class PropertyGroupMapper : BaseMapper + [MapperFor(typeof(PropertyGroup))] + public sealed class PropertyGroupMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyMapper.cs b/src/Umbraco.Core/Persistence/Mappers/PropertyMapper.cs index 3746fa7697..7d3d5d357c 100644 --- a/src/Umbraco.Core/Persistence/Mappers/PropertyMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/PropertyMapper.cs @@ -6,7 +6,8 @@ using Umbraco.Core.Models.Rdbms; namespace Umbraco.Core.Persistence.Mappers { - internal sealed class PropertyMapper : BaseMapper + [MapperFor(typeof(Property))] + public sealed class PropertyMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs index e2ba7d93f2..99bc8a5a1a 100644 --- a/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs @@ -10,7 +10,8 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class PropertyTypeMapper : BaseMapper + [MapperFor(typeof(PropertyType))] + public sealed class PropertyTypeMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs b/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs index 9175516599..1b211795ff 100644 --- a/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/RelationMapper.cs @@ -10,7 +10,8 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class RelationMapper : BaseMapper + [MapperFor(typeof(Relation))] + public sealed class RelationMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/RelationTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/RelationTypeMapper.cs index 8659dddbec..57461ba288 100644 --- a/src/Umbraco.Core/Persistence/Mappers/RelationTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/RelationTypeMapper.cs @@ -10,7 +10,8 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class RelationTypeMapper : BaseMapper + [MapperFor(typeof(RelationType))] + public sealed class RelationTypeMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/ServerRegistrationMapper.cs b/src/Umbraco.Core/Persistence/Mappers/ServerRegistrationMapper.cs index 8d2a8dbf3d..8f3c465564 100644 --- a/src/Umbraco.Core/Persistence/Mappers/ServerRegistrationMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/ServerRegistrationMapper.cs @@ -6,7 +6,8 @@ using Umbraco.Core.Models.Rdbms; namespace Umbraco.Core.Persistence.Mappers { - internal sealed class ServerRegistrationMapper : BaseMapper + [MapperFor(typeof(ServerRegistration))] + public sealed class ServerRegistrationMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs b/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs index ce750b4ed2..a8235374be 100644 --- a/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/UserMapper.cs @@ -6,7 +6,9 @@ using Umbraco.Core.Models.Rdbms; namespace Umbraco.Core.Persistence.Mappers { - internal sealed class UserMapper : BaseMapper + [MapperFor(typeof(IUser))] + [MapperFor(typeof(User))] + public sealed class UserMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Mappers/UserTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/UserTypeMapper.cs index ad62bc51e0..6858ff0610 100644 --- a/src/Umbraco.Core/Persistence/Mappers/UserTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/UserTypeMapper.cs @@ -10,7 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers /// Represents a to DTO mapper used to translate the properties of the public api /// implementation to that of the database's DTO as sql: [tableName].[columnName]. /// - internal sealed class UserTypeMapper : BaseMapper + [MapperFor(typeof(IUserType))] + [MapperFor(typeof(UserType))] + public sealed class UserTypeMapper : BaseMapper { private static readonly ConcurrentDictionary PropertyInfoCache = new ConcurrentDictionary(); diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs index dff000acc2..254133fe8e 100644 --- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Persistence.Querying public ModelToSqlExpressionHelper() { - _mapper = MappingResolver.ResolveMapperByType(typeof(T)); + _mapper = MappingResolver.Current.ResolveMapperByType(typeof(T)); } protected internal virtual string Visit(Expression exp) diff --git a/src/Umbraco.Core/PluginManager.cs b/src/Umbraco.Core/PluginManager.cs index edf36f90f8..d75cea37fa 100644 --- a/src/Umbraco.Core/PluginManager.cs +++ b/src/Umbraco.Core/PluginManager.cs @@ -11,6 +11,7 @@ using System.Xml.Linq; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Migrations; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.PropertyEditors; @@ -495,6 +496,15 @@ namespace Umbraco.Core return ResolveTypes(); } + /// + /// Returns all mapper types that have a MapperFor attribute defined + /// + /// + internal IEnumerable ResolveAssignedMapperTypes() + { + return ResolveTypesWithAttribute(); + } + /// /// Returns all available IMigrations in application /// diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index d18045b8c7..c67b0ad5e8 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -225,7 +225,7 @@ - + diff --git a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs index a89bd1c495..0272523fdc 100644 --- a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs +++ b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs @@ -26,7 +26,7 @@ namespace Umbraco.Tests.CodeFirst UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs index 840603ff78..da20c0a9e0 100644 --- a/src/Umbraco.Tests/Models/ContentXmlTest.cs +++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs @@ -19,7 +19,7 @@ namespace Umbraco.Tests.Models public override void Initialize() { //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/Models/MediaXmlTest.cs b/src/Umbraco.Tests/Models/MediaXmlTest.cs index c916dfaab8..f7ab0cd7ff 100644 --- a/src/Umbraco.Tests/Models/MediaXmlTest.cs +++ b/src/Umbraco.Tests/Models/MediaXmlTest.cs @@ -21,7 +21,7 @@ namespace Umbraco.Tests.Models Resolution.Reset(); //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/Persistence/Mappers/MappingResolverTests.cs b/src/Umbraco.Tests/Persistence/Mappers/MappingResolverTests.cs index 27341ebbb3..b15da5ec1d 100644 --- a/src/Umbraco.Tests/Persistence/Mappers/MappingResolverTests.cs +++ b/src/Umbraco.Tests/Persistence/Mappers/MappingResolverTests.cs @@ -1,5 +1,7 @@ using NUnit.Framework; +using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.ObjectResolution; using Umbraco.Core.Persistence.Mappers; using Umbraco.Tests.TestHelpers; @@ -8,10 +10,21 @@ namespace Umbraco.Tests.Persistence.Mappers [TestFixture] public class MappingResolverTests : BaseUsingSqlCeSyntax { + public override void Initialize() + { + base.Initialize(); + } + + public override void TearDown() + { + base.TearDown(); + } + + [Test] public void Can_Map_Id_Property_On_Content() { - var mapping = MappingResolver.GetMapping(typeof (Content), "Id"); + var mapping = MappingResolver.Current.GetMapping(typeof (Content), "Id"); Assert.That(mapping, Is.EqualTo("[umbracoNode].[id]")); } @@ -19,7 +32,7 @@ namespace Umbraco.Tests.Persistence.Mappers [Test] public void Can_Map_Alias_Property_On_ContentType() { - var mapping = MappingResolver.GetMapping(typeof(ContentType), "Alias"); + var mapping = MappingResolver.Current.GetMapping(typeof(ContentType), "Alias"); Assert.That(mapping, Is.EqualTo("[cmsContentType].[alias]")); } @@ -27,14 +40,14 @@ namespace Umbraco.Tests.Persistence.Mappers [Test] public void Can_Resolve_ContentType_Mapper() { - var mapper = MappingResolver.ResolveMapperByType(typeof (ContentType)); + var mapper = MappingResolver.Current.ResolveMapperByType(typeof(ContentType)); Assert.IsTrue(mapper is ContentTypeMapper); } [Test] public void Can_Resolve_Dictionary_Mapper() { - var mapper = MappingResolver.ResolveMapperByType(typeof(IDictionaryItem)); + var mapper = MappingResolver.Current.ResolveMapperByType(typeof(IDictionaryItem)); Assert.IsTrue(mapper is DictionaryMapper); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 6a942594ae..e85edb33f8 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Persistence.Repositories { //NOTE The DataTypesResolver is only necessary because we are using the Save method in the ContentService //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index 3708c4b98e..12f9ab5b32 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -23,7 +23,7 @@ namespace Umbraco.Tests.Persistence.Repositories { //NOTE The DataTypesResolver is only necessary because we are using the Save method in the MediaService //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs index 73249bc3a1..f72b47f985 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Persistence.Repositories { //NOTE The DataTypesResolver is only necessary because we are using the Save method in the ContentService //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/PluginManagerTests.cs b/src/Umbraco.Tests/PluginManagerTests.cs index 83e950f7d2..1f6d0bdef6 100644 --- a/src/Umbraco.Tests/PluginManagerTests.cs +++ b/src/Umbraco.Tests/PluginManagerTests.cs @@ -263,6 +263,13 @@ namespace Umbraco.Tests .Count(x => x.IsTypeList(PluginManager.TypeResolutionKind.FindAllTypes))); } + [Test] + public void Resolves_Assigned_Mappers() + { + var foundTypes1 = PluginManager.Current.ResolveAssignedMapperTypes(); + Assert.AreEqual(16, foundTypes1.Count()); + } + [Test] public void Resolves_Types() { diff --git a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs index ad7e7c1d4d..30292fb183 100644 --- a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs +++ b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs @@ -27,7 +27,7 @@ namespace Umbraco.Tests.Publishing UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index a9a1f8a881..7cb29a0ff8 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -21,7 +21,7 @@ namespace Umbraco.Tests.Routing public override void Initialize() { //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); SurfaceControllerResolver.Current = new SurfaceControllerResolver( PluginManager.Current.ResolveSurfaceControllers()); diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs index 45e25210e5..799309db75 100644 --- a/src/Umbraco.Tests/Services/BaseServiceTest.cs +++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs @@ -17,7 +17,7 @@ namespace Umbraco.Tests.Services { //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index dde6c5fe46..a6c2f418cc 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -29,7 +29,7 @@ namespace Umbraco.Tests.Services { //NOTE The DataTypesResolver is only necessary because we are using the Save method in the MediaService //this ensures its reset - PluginManager.Current = new PluginManager(); + PluginManager.Current = new PluginManager(false); //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 67f769bc34..bcf51b4236 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -13,6 +13,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.ObjectResolution; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Publishing; @@ -41,6 +42,8 @@ namespace Umbraco.Tests.TestHelpers string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", path); + PluginManager.Current = new PluginManager(false); + //Ensure that any database connections from a previous test is disposed. This is really just double safety as its also done in the TearDown. if(ApplicationContext != null && DatabaseContext != null) DatabaseContext.Database.Dispose(); @@ -69,6 +72,11 @@ namespace Umbraco.Tests.TestHelpers SqlSyntaxProvidersResolver.Current = new SqlSyntaxProvidersResolver( new List{ typeof(MySqlSyntaxProvider), typeof(SqlCeSyntaxProvider), typeof(SqlServerSyntaxProvider) }) { CanResolveBeforeFrozen = true}; + var asdf = typeof (ContentMapper); + + MappingResolver.Current = new MappingResolver( + () => PluginManager.Current.ResolveAssignedMapperTypes()); + //Get the connectionstring settings from config var settings = ConfigurationManager.ConnectionStrings[Core.Configuration.GlobalSettings.UmbracoConnectionName]; ConfigurationManager.AppSettings.Set(Core.Configuration.GlobalSettings.UmbracoConnectionName, @"datalayer=SQLCE4Umbraco.SqlCEHelper,SQLCE4Umbraco;data source=|DataDirectory|\UmbracoPetaPocoTests.sdf"); @@ -117,7 +125,7 @@ namespace Umbraco.Tests.TestHelpers SqlCeContextGuardian.CloseBackgroundConnection(); ApplicationContext.Current = null; - + MappingResolver.Reset(); RepositoryResolver.Reset(); SqlSyntaxProvidersResolver.Reset(); Resolution.Reset(); diff --git a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs index 7d2e2c55f9..2af1e1bf4e 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs @@ -1,4 +1,7 @@ using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.ObjectResolution; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Tests.TestHelpers @@ -10,7 +13,31 @@ namespace Umbraco.Tests.TestHelpers public virtual void Initialize() { SqlSyntaxContext.SqlSyntaxProvider = SqlCeSyntax.Provider; + PluginManager.Current = new PluginManager(false); + MappingResolver.Current = new MappingResolver( + () => PluginManager.Current.ResolveAssignedMapperTypes()); + //MappingResolver.Current = new MappingResolver( + // new[] + // { + // typeof(ContentMapper), + // typeof(ContentTypeMapper), + // typeof(DataTypeDefinitionMapper), + // typeof(DictionaryMapper), + // typeof(DictionaryTranslationMapper), + // typeof(LanguageMapper), + // typeof(MediaMapper), + // typeof(MediaTypeMapper), + // typeof(PropertyGroupMapper), + // typeof(PropertyMapper), + // typeof(PropertyTypeMapper), + // typeof(RelationMapper), + // typeof(RelationTypeMapper), + // typeof(ServerRegistrationMapper), + // typeof(UserMapper), + // typeof(UserTypeMapper) + // }); + Resolution.Freeze(); SetUp(); } @@ -20,7 +47,9 @@ namespace Umbraco.Tests.TestHelpers [TearDown] public virtual void TearDown() { + MappingResolver.Reset(); SqlSyntaxContext.SqlSyntaxProvider = null; + PluginManager.Current = null; } } } \ No newline at end of file