Skip to content

Commit 1773b0e

Browse files
committed
Moved ability to add overrides by type to the AutoPersistenceModel
1 parent 8ddda12 commit 1773b0e

File tree

2 files changed

+41
-28
lines changed

2 files changed

+41
-28
lines changed

src/FluentNHibernate/Automapping/Alterations/AutoMappingOverrideAlteration.cs

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,37 +33,17 @@ public AutoMappingOverrideAlteration(Assembly overrideAssembly)
3333
public void Alter(AutoPersistenceModel model)
3434
{
3535
// find all types deriving from IAutoMappingOverride<T>
36-
var types = from type in assembly.GetExportedTypes()
37-
let entity = (from interfaceType in type.GetInterfaces()
38-
where interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IAutoMappingOverride<>)
39-
select interfaceType.GetGenericArguments()[0]).FirstOrDefault()
40-
where entity != null
41-
select new { OverrideType = type, EntityType = entity };
36+
var types = from type in assembly.GetExportedTypes()
37+
let entity = (from interfaceType in type.GetInterfaces()
38+
where interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IAutoMappingOverride<>)
39+
select interfaceType.GetGenericArguments()[0]).FirstOrDefault()
40+
where entity != null
41+
select type;
4242

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

src/FluentNHibernate/Automapping/AutoPersistenceModel.cs

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

318+
/// <summary>
319+
/// Adds an IAutoMappingOverride reflectively
320+
/// </summary>
321+
/// <param name="overrideType">Override type, expected to be an IAutoMappingOverride</param>
322+
public void Override(Type overrideType)
323+
{
324+
Type overrideInterface = overrideType.GetInterfaces()
325+
.Where(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IAutoMappingOverride<>) && x.GetGenericArguments().Length > 0)
326+
.FirstOrDefault();
327+
if (overrideInterface != null)
328+
{
329+
Type entityType = overrideInterface.GetGenericArguments().First();
330+
Type autoMappingType = typeof(AutoMapping<>).MakeGenericType(entityType);
331+
AddOverride(entityType, x =>
332+
{
333+
if (x.GetType().IsAssignableFrom(autoMappingType))
334+
{
335+
var overrideInstance = Activator.CreateInstance(overrideType);
336+
GetType()
337+
.GetMethod("OverrideHelper", BindingFlags.NonPublic | BindingFlags.Instance)
338+
.MakeGenericMethod(entityType)
339+
.Invoke(this, new [] {x, overrideInstance});
340+
}
341+
});
342+
}
343+
}
344+
345+
//called reflectively from method above
346+
private void OverrideHelper<T>(AutoMapping<T> x, IAutoMappingOverride<T> mappingOverride)
347+
{
348+
mappingOverride.Override(x);
349+
}
350+
318351
/// <summary>
319352
/// Override all mappings.
320353
/// </summary>

0 commit comments

Comments
 (0)