Skip to content

Commit 618deb4

Browse files
committed
Fix chain of FileEntityTypeMap decorated with a previous instance being registered with every accessor eventually causing StackOverflowException
1 parent 466add8 commit 618deb4

3 files changed

Lines changed: 10 additions & 5 deletions

File tree

src/Dibix.Dapper/DapperDatabaseAccessor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ public class DapperDatabaseAccessor : DatabaseAccessor, IDatabaseAccessor, IDisp
1212
{
1313
#region Constructor
1414
public DapperDatabaseAccessor(DbConnection connection, DatabaseAccessorOptions options) : base(connection, options)
15+
{
16+
}
17+
18+
static DapperDatabaseAccessor()
1519
{
1620
ConfigureDapper();
1721
}
@@ -100,7 +104,7 @@ protected object CollectParameters(ParametersVisitor parametersVisitor)
100104
private static void ConfigureDapper()
101105
{
102106
SqlMapper.AddTypeHandler(new DapperUriTypeHandler());
103-
SqlMapper.SetTypeMap(FileEntityTypeMap.Type, new FileEntityTypeMap());
107+
DecoratedTypeMap.RegisterOnce(FileEntityTypeMap.Type, (x, _) => new FileEntityTypeMap(x));
104108
}
105109
#endregion
106110

src/Dibix.Dapper/DecoratedTypeMap.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,17 @@ private protected DecoratedTypeMap(SqlMapper.ITypeMap inner, Type type)
3232
private static void AdaptCore(params Type[] types)
3333
{
3434
foreach (Type type in types)
35-
Register(type);
35+
RegisterOnce(type);
3636
}
3737

38-
private static void Register(Type type)
38+
private static void RegisterOnce(Type type) => RegisterOnce(type, (x, y) => new DecoratedTypeMap(x, y));
39+
public static void RegisterOnce(Type type, Func<SqlMapper.ITypeMap, Type, SqlMapper.ITypeMap> wrapper)
3940
{
4041
SqlMapper.ITypeMap typeMap = SqlMapper.GetTypeMap(type);
4142
if (typeMap is DecoratedTypeMap)
4243
return;
4344

44-
SqlMapper.SetTypeMap(type, new DecoratedTypeMap(typeMap, type));
45+
SqlMapper.SetTypeMap(type, wrapper(typeMap, type));
4546
}
4647
#endregion
4748

src/Dibix.Dapper/FileEntityTypeMap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ internal sealed class FileEntityTypeMap : DecoratedTypeMap, SqlMapper.ITypeMap
77
{
88
public static readonly Type Type = typeof(FileEntity);
99

10-
internal FileEntityTypeMap() : base(SqlMapper.GetTypeMap(Type), Type) { }
10+
internal FileEntityTypeMap(SqlMapper.ITypeMap inner) : base(inner, Type) { }
1111

1212
public override SqlMapper.IMemberMap GetMember(string columnName)
1313
{

0 commit comments

Comments
 (0)