Skip to content

Commit 7eef2e2

Browse files
refactor: update _namespaces_, and cache so that we don't have to repeat the lookup logic over and over
1 parent ba4a93f commit 7eef2e2

File tree

2 files changed

+52
-12
lines changed

2 files changed

+52
-12
lines changed

src/EntityDb.Common/TypeResolvers/DefaultPartialTypeResolver.cs

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace EntityDb.Common.TypeResolvers;
88
internal sealed class DefaultPartialTypeResolver : IPartialTypeResolver
99
{
1010
private readonly IOptions<DefaultPartialTypeResolverOptions> _options;
11+
private readonly Dictionary<string, Type> _cache = new();
1112

1213
public DefaultPartialTypeResolver(IOptions<DefaultPartialTypeResolverOptions> options)
1314
{
@@ -24,30 +25,59 @@ public bool TryResolveType(EnvelopeHeaders envelopeHeaders, [NotNullWhen(true)]
2425
return false;
2526
}
2627

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);
3541

3642
return true;
3743
}
3844

39-
private Assembly AssemblyResolver(AssemblyName assemblyName)
45+
private bool TryGetType(string qualifiedTypeName, [NotNullWhen(true)] out Type? resolvedType)
4046
{
41-
if (assemblyName.Name is { } originalName && _options.Value.UpdateNames.TryGetValue(originalName, out var newName))
47+
foreach (var (oldNamespace, newNamespace) in _options.Value.UpdateNamespaces)
4248
{
43-
assemblyName.Name = newName;
49+
qualifiedTypeName = qualifiedTypeName.Replace(oldNamespace, newNamespace);
4450
}
4551

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+
{
4666
if (_options.Value.IgnoreVersion)
4767
{
4868
assemblyName.Version = null;
4969
}
5070

5171
return Assembly.Load(assemblyName);
5272
}
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+
}
5383
}

src/EntityDb.Common/TypeResolvers/DefaultPartialTypeResolverOptions.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,22 @@ namespace EntityDb.Common.TypeResolvers;
55
/// </summary>
66
public sealed class DefaultPartialTypeResolverOptions
77
{
8+
/// <summary>
9+
/// Throw an exception if the type cannot be resolved.
10+
/// </summary>
11+
public bool ThrowOnError { get; set; } = true;
12+
13+
/// <summary>
14+
/// Perform a case-insensitive search for the type name.
15+
/// </summary>
16+
public bool IgnoreCase { get; set; } = false;
17+
818
/// <summary>
919
/// If you rename your assemblies, you will want to update the
1020
/// name of the assembly for type resolving purposes, at least
1121
/// until you update the data header.
1222
/// </summary>
13-
public Dictionary<string, string> UpdateNames { get; set; } = new();
23+
public Dictionary<string, string> UpdateNamespaces { get; set; } = new();
1424

1525
/// <summary>
1626
/// If you version your assemblies, you may want to ignore the

0 commit comments

Comments
 (0)