diff --git a/Marr.Data/MapRepository.cs b/Marr.Data/MapRepository.cs index 25489d15f..c60dc4c09 100644 --- a/Marr.Data/MapRepository.cs +++ b/Marr.Data/MapRepository.cs @@ -38,7 +38,7 @@ namespace Marr.Data internal Dictionary Tables { get; set; } internal Dictionary Columns { get; set; } internal Dictionary Relationships { get; set; } - internal Dictionary TypeConverters { get; set; } + public Dictionary TypeConverters { get; private set; } // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit @@ -203,14 +203,7 @@ namespace Marr.Data /// An IConverter object that will handle the data conversion. public void RegisterTypeConverter(Type type, IConverter converter) { - if (TypeConverters.ContainsKey(type)) - { - TypeConverters[type] = converter; - } - else - { - TypeConverters.Add(type, converter); - } + TypeConverters[type] = converter; } /// diff --git a/NzbDrone.Core.Test/Datastore/MappingExtentionFixture.cs b/NzbDrone.Core.Test/Datastore/MappingExtentionFixture.cs index 4324e5aef..6300c6568 100644 --- a/NzbDrone.Core.Test/Datastore/MappingExtentionFixture.cs +++ b/NzbDrone.Core.Test/Datastore/MappingExtentionFixture.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using FluentAssertions; +using Marr.Data; using NUnit.Framework; using NzbDrone.Core.Datastore; +using NzbDrone.Core.Datastore.Converters; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Test.Datastore @@ -35,6 +37,15 @@ namespace NzbDrone.Core.Test.Datastore public int WriteOnly { private get; set; } } + [SetUp] + public void Setup() + { + MapRepository.Instance.RegisterTypeConverter(typeof(List), new EmbeddedDocumentConverter()); + MapRepository.Instance.RegisterTypeConverter(typeof(EmbeddedType), new EmbeddedDocumentConverter()); + MapRepository.Instance.RegisterTypeConverter(typeof(Int32), new Int32Converter()); + + } + [Test] public void test_mappable_types() diff --git a/NzbDrone.Core/Datastore/MappingExtensions.cs b/NzbDrone.Core/Datastore/MappingExtensions.cs index 7dc1d69c4..468f6bfdf 100644 --- a/NzbDrone.Core/Datastore/MappingExtensions.cs +++ b/NzbDrone.Core/Datastore/MappingExtensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using Marr.Data; using Marr.Data.Mapping; namespace NzbDrone.Core.Datastore @@ -25,19 +26,18 @@ namespace NzbDrone.Core.Datastore if (propertyInfo == null) return false; - if (propertyInfo.PropertyType.GetInterfaces().Any(i => i == typeof(IEmbeddedDocument))) + + if (!propertyInfo.IsReadable() || !propertyInfo.IsWritable()) + { + return false; + } + + if (IsSimpleType(propertyInfo.PropertyType) || MapRepository.Instance.TypeConverters.ContainsKey(propertyInfo.PropertyType)) { return true; } - if (typeof(IEnumerable).IsAssignableFrom(propertyInfo.PropertyType)) - { - return true; - } - - var result = propertyInfo.IsReadable() && propertyInfo.IsWritable() && IsSimpleType(propertyInfo.PropertyType); - - return result; + return false; } public static bool IsSimpleType(Type type) diff --git a/NzbDrone.Core/Datastore/TableMapping.cs b/NzbDrone.Core/Datastore/TableMapping.cs index 5d9cfb287..1343dc38b 100644 --- a/NzbDrone.Core/Datastore/TableMapping.cs +++ b/NzbDrone.Core/Datastore/TableMapping.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; -using System.Linq.Expressions; -using System.Reflection; +using System.Linq; using Marr.Data; using Marr.Data.Mapping; using NzbDrone.Core.Configuration; @@ -16,7 +15,6 @@ using NzbDrone.Core.ReferenceData; using NzbDrone.Core.RootFolders; using NzbDrone.Core.Tv; using BooleanIntConverter = NzbDrone.Core.Datastore.Converters.BooleanIntConverter; -using System.Linq; namespace NzbDrone.Core.Datastore { @@ -56,12 +54,28 @@ namespace NzbDrone.Core.Datastore private static void RegisterMappers() { + RegisterEmbeddedConverter(); + MapRepository.Instance.RegisterTypeConverter(typeof(Int32), new Int32Converter()); MapRepository.Instance.RegisterTypeConverter(typeof(Boolean), new BooleanIntConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Enum), new EnumIntConverter()); - MapRepository.Instance.RegisterTypeConverter(typeof(QualityModel), new EmbeddedDocumentConverter()); - MapRepository.Instance.RegisterTypeConverter(typeof(List), new EmbeddedDocumentConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Quality), new QualityIntConverter()); } + + private static void RegisterEmbeddedConverter() + { + var embeddedTypes = typeof(IEmbeddedDocument).Assembly.GetTypes() + .Where(c => c.GetInterfaces().Any(i => i == typeof(IEmbeddedDocument))); + + + var embeddedConvertor = new EmbeddedDocumentConverter(); + var genericListDefinition = typeof(List<>).GetGenericTypeDefinition(); + foreach (var embeddedType in embeddedTypes) + { + var embeddedListType = genericListDefinition.MakeGenericType(embeddedType); + MapRepository.Instance.RegisterTypeConverter(embeddedType, embeddedConvertor); + MapRepository.Instance.RegisterTypeConverter(embeddedListType, embeddedConvertor); + } + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Qualities/Quality.cs b/NzbDrone.Core/Qualities/Quality.cs index 0e437a2bc..f327ff892 100644 --- a/NzbDrone.Core/Qualities/Quality.cs +++ b/NzbDrone.Core/Qualities/Quality.cs @@ -5,7 +5,7 @@ using NzbDrone.Core.Datastore; namespace NzbDrone.Core.Qualities { - public class Quality : IComparable, IEmbeddedDocument + public class Quality : IComparable { public int Id { get; set; } public string Name { get; set; }