Skip to content

Commit f22a011

Browse files
committed
Merge branch 'cleaner_override' of https://github.com/icambron/fluent-nhibernate into icambron-cleaner_override
Conflicts: src/FluentNHibernate/Automapping/Alterations/AutoMappingOverrideAlteration.cs
2 parents de40e89 + 1773b0e commit f22a011

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

src/FluentNHibernate/Automapping/Alterations/AutoMappingOverrideAlteration.cs

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,37 +34,17 @@ public void Alter(AutoPersistenceModel model)
3434
{
3535
// find all types deriving from IAutoMappingOverride<T>
3636
var types = from type in assembly.GetExportedTypes()
37-
where !type.IsAbstract
37+
where !type.IsAbstract
3838
let entity = (from interfaceType in type.GetInterfaces()
3939
where interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IAutoMappingOverride<>)
4040
select interfaceType.GetGenericArguments()[0]).FirstOrDefault()
4141
where entity != null
42-
select new { OverrideType = type, EntityType = entity };
42+
select type;
4343

44-
foreach (var typeMatch in types)
44+
foreach (var type in types)
4545
{
46-
var mappingOverride = Activator.CreateInstance(typeMatch.OverrideType);
47-
var autoMapType = typeof(AutoMapping<>).MakeGenericType(typeMatch.EntityType);
48-
var mapping = (IMappingProvider)Activator.CreateInstance(autoMapType, new List<Member>());
49-
50-
// HACK: call the Override method with the generic AutoMapping<T>
51-
var overrideMethod = typeMatch.OverrideType
52-
.GetMethod("Override");
53-
54-
GetType()
55-
.GetMethod("AddOverride", BindingFlags.Instance | BindingFlags.NonPublic)
56-
.MakeGenericMethod(typeMatch.EntityType)
57-
.Invoke(this, new[] { model, typeMatch.EntityType, mappingOverride });
46+
model.Override(type);
5847
}
5948
}
60-
61-
private void AddOverride<T>(AutoPersistenceModel model, Type entity, IAutoMappingOverride<T> mappingOverride)
62-
{
63-
model.AddOverride(entity, x =>
64-
{
65-
if (x is AutoMapping<T>)
66-
mappingOverride.Override((AutoMapping<T>)x);
67-
});
68-
}
6949
}
7050
}

src/FluentNHibernate/Automapping/AutoPersistenceModel.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,39 @@ public AutoPersistenceModel Override<T>(Action<AutoMapping<T>> populateMap)
345345
return this;
346346
}
347347

348+
/// <summary>
349+
/// Adds an IAutoMappingOverride reflectively
350+
/// </summary>
351+
/// <param name="overrideType">Override type, expected to be an IAutoMappingOverride</param>
352+
public void Override(Type overrideType)
353+
{
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+
GetType()
367+
.GetMethod("OverrideHelper", BindingFlags.NonPublic | BindingFlags.Instance)
368+
.MakeGenericMethod(entityType)
369+
.Invoke(this, new [] {x, overrideInstance});
370+
}
371+
});
372+
}
373+
}
374+
375+
//called reflectively from method above
376+
private void OverrideHelper<T>(AutoMapping<T> x, IAutoMappingOverride<T> mappingOverride)
377+
{
378+
mappingOverride.Override(x);
379+
}
380+
348381
/// <summary>
349382
/// Override all mappings.
350383
/// </summary>

0 commit comments

Comments
 (0)