@@ -8,6 +8,7 @@ namespace EntityDb.Common.TypeResolvers;
8
8
internal sealed class DefaultPartialTypeResolver : IPartialTypeResolver
9
9
{
10
10
private readonly IOptions < DefaultPartialTypeResolverOptions > _options ;
11
+ private readonly Dictionary < string , Type > _cache = new ( ) ;
11
12
12
13
public DefaultPartialTypeResolver ( IOptions < DefaultPartialTypeResolverOptions > options )
13
14
{
@@ -24,30 +25,59 @@ public bool TryResolveType(EnvelopeHeaders envelopeHeaders, [NotNullWhen(true)]
24
25
return false ;
25
26
}
26
27
27
- resolvedType = Type . GetType
28
- (
29
- Assembly . CreateQualifiedName ( assemblyFullName , typeFullName ) ,
30
- AssemblyResolver ,
31
- ( assembly , typeName , ignoreCase ) => assembly ! . GetType ( typeName , true , ignoreCase ) ,
32
- true ,
33
- false
34
- ) ! ;
28
+ var qualifiedTypeName = Assembly . CreateQualifiedName ( assemblyFullName , typeFullName ) ;
29
+
30
+ if ( _cache . TryGetValue ( qualifiedTypeName , out resolvedType ) )
31
+ {
32
+ return true ;
33
+ }
34
+
35
+ if ( ! TryGetType ( qualifiedTypeName , out resolvedType ) )
36
+ {
37
+ return false ;
38
+ }
39
+
40
+ _cache . Add ( qualifiedTypeName , resolvedType ) ;
35
41
36
42
return true ;
37
43
}
38
44
39
- private Assembly AssemblyResolver ( AssemblyName assemblyName )
45
+ private bool TryGetType ( string qualifiedTypeName , [ NotNullWhen ( true ) ] out Type ? resolvedType )
40
46
{
41
- if ( assemblyName . Name is { } originalName && _options . Value . UpdateNames . TryGetValue ( originalName , out var newName ) )
47
+ foreach ( var ( oldNamespace , newNamespace ) in _options . Value . UpdateNamespaces )
42
48
{
43
- assemblyName . Name = newName ;
49
+ qualifiedTypeName = qualifiedTypeName . Replace ( oldNamespace , newNamespace ) ;
44
50
}
45
51
52
+ resolvedType = Type . GetType
53
+ (
54
+ qualifiedTypeName ,
55
+ AssemblyResolver ,
56
+ TypeResolver ,
57
+ _options . Value . ThrowOnError ,
58
+ _options . Value . IgnoreCase
59
+ ) ;
60
+
61
+ return resolvedType is not null ;
62
+ }
63
+
64
+ private Assembly AssemblyResolver ( AssemblyName assemblyName )
65
+ {
46
66
if ( _options . Value . IgnoreVersion )
47
67
{
48
68
assemblyName . Version = null ;
49
69
}
50
70
51
71
return Assembly . Load ( assemblyName ) ;
52
72
}
73
+
74
+ private Type ? TypeResolver ( Assembly ? assembly , string typeName , bool ignoreCase )
75
+ {
76
+ return assembly ? . GetType
77
+ (
78
+ typeName ,
79
+ _options . Value . ThrowOnError ,
80
+ ignoreCase
81
+ ) ;
82
+ }
53
83
}
0 commit comments