Skip to content

Commit 5984ded

Browse files
committed
Tiny cleanup refactoring of AutoPersistenceModel
1 parent f1f0a2e commit 5984ded

File tree

4 files changed

+44
-26
lines changed

4 files changed

+44
-26
lines changed

src/FluentNHibernate/Automapping/AutoMapper.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using FluentNHibernate.MappingModel;
66
using FluentNHibernate.MappingModel.ClassBased;
77
using FluentNHibernate.Utils;
8+
using FluentNHibernate.Utils.Reflection;
89

910
namespace FluentNHibernate.Automapping
1011
{
@@ -24,7 +25,7 @@ public AutoMapper(IAutomappingConfiguration cfg, IConventionFinder conventionFin
2425

2526
private void ApplyOverrides(Type classType, IList<Member> mappedMembers, ClassMappingBase mapping)
2627
{
27-
var autoMapType = typeof(AutoMapping<>).MakeGenericType(classType);
28+
var autoMapType = ReflectionHelper.AutomappingTypeForEntityType(classType);
2829
var autoMap = Activator.CreateInstance(autoMapType, mappedMembers);
2930

3031
inlineOverrides

src/FluentNHibernate/Automapping/AutoPersistenceModel.cs

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
using FluentNHibernate.Mapping.Providers;
99
using FluentNHibernate.MappingModel;
1010
using FluentNHibernate.MappingModel.ClassBased;
11+
using FluentNHibernate.Utils;
12+
using FluentNHibernate.Utils.Reflection;
1113
using FluentNHibernate.Visitors;
1214

1315
namespace FluentNHibernate.Automapping
@@ -345,37 +347,40 @@ public AutoPersistenceModel Override<T>(Action<AutoMapping<T>> populateMap)
345347
return this;
346348
}
347349

350+
static bool IsAutomappingForType(object o, Type entityType)
351+
{
352+
var autoMappingType = ReflectionHelper.AutomappingTypeForEntityType(entityType);
353+
354+
return o.GetType().IsAssignableFrom(autoMappingType);
355+
}
356+
348357
/// <summary>
349358
/// Adds an IAutoMappingOverride reflectively
350359
/// </summary>
351360
/// <param name="overrideType">Override type, expected to be an IAutoMappingOverride</param>
352361
public void Override(Type overrideType)
353362
{
354-
Type overrideInterface = overrideType.GetInterfaces()
355-
.Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IAutoMappingOverride<>) && x.GetGenericArguments().Length > 0)
356-
.FirstOrDefault();
357-
if (overrideInterface != null)
358-
{
359-
Type entityType = overrideInterface.GetGenericArguments().First();
360-
Type autoMappingType = typeof(AutoMapping<>).MakeGenericType(entityType);
361-
AddOverride(entityType, x =>
362-
{
363-
if (x.GetType().IsAssignableFrom(autoMappingType))
364-
{
365-
var overrideInstance = Activator.CreateInstance(overrideType);
366-
367-
MethodInfo overrideHelperMethod = typeof(AutoPersistenceModel)
368-
.GetMethod("OverrideHelper", BindingFlags.NonPublic | BindingFlags.Instance);
369-
370-
if (overrideHelperMethod != null)
371-
{
372-
overrideHelperMethod
373-
.MakeGenericMethod(entityType)
374-
.Invoke(this, new[] {x, overrideInstance});
375-
}
376-
}
377-
});
378-
}
363+
var overrideInterface = overrideType.GetInterfaces().FirstOrDefault(x => x.IsAutoMappingOverrideType());
364+
365+
if (overrideInterface == null) return;
366+
367+
var entityType = overrideInterface.GetGenericArguments().First();
368+
369+
AddOverride(entityType, instance =>
370+
{
371+
if (!IsAutomappingForType(instance, entityType)) return;
372+
373+
var overrideInstance = Activator.CreateInstance(overrideType);
374+
375+
MethodInfo overrideHelperMethod = typeof(AutoPersistenceModel)
376+
.GetMethod("OverrideHelper", BindingFlags.NonPublic | BindingFlags.Instance);
377+
378+
if (overrideHelperMethod == null) return;
379+
380+
overrideHelperMethod
381+
.MakeGenericMethod(entityType)
382+
.Invoke(this, new[] {instance, overrideInstance});
383+
});
379384
}
380385

381386
//called reflectively from method above

src/FluentNHibernate/Utils/Extensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.IO;
33
using System.Linq;
44
using System.Runtime.Serialization.Formatters.Binary;
5+
using FluentNHibernate.Automapping.Alterations;
56
using NHibernate.Util;
67

78
namespace FluentNHibernate.Utils
@@ -75,5 +76,10 @@ public static T DeepClone<T>(this T obj)
7576
return (T)formatter.Deserialize(stream);
7677
}
7778
}
79+
80+
public static bool IsAutoMappingOverrideType(this Type type)
81+
{
82+
return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IAutoMappingOverride<>) && type.GetGenericArguments().Length > 0;
83+
}
7884
}
7985
}

src/FluentNHibernate/Utils/Reflection/ReflectionHelper.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
using System.Reflection;
55

66
using FluentNHibernate;
7+
using FluentNHibernate.Automapping;
78

89
namespace FluentNHibernate.Utils.Reflection
910
{
1011
public static class ReflectionHelper
1112
{
13+
public static Type AutomappingTypeForEntityType(Type entityType)
14+
{
15+
return typeof(AutoMapping<>).MakeGenericType(entityType);
16+
}
17+
1218
public static Member GetMember<TModel, TReturn>(Expression<Func<TModel, TReturn>> expression)
1319
{
1420
return GetMember(expression.Body);

0 commit comments

Comments
 (0)