1
- using System . Diagnostics ;
1
+ using System ;
2
+ using System . Collections . Concurrent ;
3
+ using System . Diagnostics ;
2
4
using System . Reflection ;
3
5
using System . Threading . Tasks ;
4
6
using BlazorLazyLoading . Abstractions ;
7
+ using BlazorLazyLoading . Comparers ;
5
8
using BlazorLazyLoading . Models ;
6
9
7
10
namespace BlazorLazyLoading . Services
@@ -11,24 +14,36 @@ public sealed class AssemblyDataProvider : IAssemblyDataProvider
11
14
private readonly IAssemblyDataLocator _assemblyDataLocator ;
12
15
private readonly IContentFileReader _contentFileReader ;
13
16
17
+ private readonly ConcurrentDictionary < AssemblyName , AssemblyData ? > _assemblyDataCache ;
18
+
14
19
public AssemblyDataProvider (
15
20
IAssemblyDataLocator assemblyDataLocator ,
16
21
IContentFileReader contentFileReader )
17
22
{
18
23
_assemblyDataLocator = assemblyDataLocator ;
19
24
_contentFileReader = contentFileReader ;
25
+ _assemblyDataCache = new ConcurrentDictionary < AssemblyName , AssemblyData ? > ( AssemblyByNameAndVersionComparer . Default ) ;
20
26
}
21
27
22
- public async Task < AssemblyData ? > GetAssemblyDataAsync ( AssemblyName assemblyName , AssemblyLoaderContext context )
28
+ public async Task < AssemblyData ? > GetAssemblyDataAsync (
29
+ AssemblyName assemblyName ,
30
+ AssemblyLoaderContext context )
23
31
{
32
+ if ( _assemblyDataCache . TryGetValue ( assemblyName , out AssemblyData ? data ) )
33
+ {
34
+ return data ;
35
+ }
36
+
24
37
var paths = _assemblyDataLocator . GetFindPaths ( assemblyName , context ) ;
25
38
26
39
foreach ( var path in paths )
27
40
{
28
- AssemblyData ? data = await GetAssemblyDataAsync ( assemblyName , path ) . ConfigureAwait ( false ) ;
41
+ data = await GetAssemblyDataAsync ( assemblyName , path ) . ConfigureAwait ( false ) ;
29
42
30
43
if ( data != null )
31
44
{
45
+ _assemblyDataCache . TryAdd ( assemblyName , data ) ;
46
+
32
47
return data ;
33
48
}
34
49
}
0 commit comments