@@ -7,21 +7,26 @@ namespace GitHub.Extensions
7
7
{
8
8
public static class VSExtensions
9
9
{
10
+ static IUIProvider cachedUIProvider = null ;
11
+
10
12
public static T TryGetService < T > ( this IServiceProvider serviceProvider ) where T : class
11
13
{
12
14
return serviceProvider . TryGetService ( typeof ( T ) ) as T ;
13
15
}
14
16
15
17
public static object TryGetService ( this IServiceProvider serviceProvider , Type type )
16
18
{
19
+ if ( cachedUIProvider != null && type == typeof ( IUIProvider ) )
20
+ return cachedUIProvider ;
21
+
17
22
var ui = serviceProvider as IUIProvider ;
18
23
if ( ui != null )
19
24
return ui . TryGetService ( type ) ;
20
25
else
21
26
{
22
27
try
23
28
{
24
- return serviceProvider . GetService ( type ) ;
29
+ return GetServiceAndCache ( serviceProvider , type , ref cachedUIProvider ) ;
25
30
}
26
31
catch ( Exception ex )
27
32
{
@@ -33,20 +38,42 @@ public static object TryGetService(this IServiceProvider serviceProvider, Type t
33
38
34
39
public static T GetService < T > ( this IServiceProvider serviceProvider )
35
40
{
36
- return ( T ) serviceProvider . GetService ( typeof ( T ) ) ;
41
+ if ( cachedUIProvider != null && typeof ( T ) == typeof ( IUIProvider ) )
42
+ return ( T ) cachedUIProvider ;
43
+
44
+ return ( T ) GetServiceAndCache ( serviceProvider , typeof ( T ) , ref cachedUIProvider ) ;
37
45
}
38
46
39
47
public static T GetExportedValue < T > ( this IServiceProvider serviceProvider )
40
48
{
49
+ if ( cachedUIProvider != null && typeof ( T ) == typeof ( IUIProvider ) )
50
+ return ( T ) cachedUIProvider ;
51
+
41
52
var ui = serviceProvider as IUIProvider ;
42
53
return ui != null
43
54
? ui . GetService < T > ( )
44
- : VisualStudio . Services . ComponentModel . DefaultExportProvider . GetExportedValue < T > ( ) ;
55
+ : GetExportedValueAndCache < T , IUIProvider > ( ref cachedUIProvider ) ;
45
56
}
46
57
47
58
public static ITeamExplorerSection GetSection ( this IServiceProvider serviceProvider , Guid section )
48
59
{
49
60
return serviceProvider ? . GetService < ITeamExplorerPage > ( ) ? . GetSection ( section ) ;
50
61
}
62
+
63
+ static object GetServiceAndCache < CacheType > ( IServiceProvider provider , Type type , ref CacheType cache )
64
+ {
65
+ var ret = provider . GetService ( type ) ;
66
+ if ( type == typeof ( CacheType ) )
67
+ cache = ( CacheType ) ret ;
68
+ return ret ;
69
+ }
70
+
71
+ static T GetExportedValueAndCache < T , CacheType > ( ref CacheType cache )
72
+ {
73
+ var ret = VisualStudio . Services . ComponentModel . DefaultExportProvider . GetExportedValue < T > ( ) ;
74
+ if ( typeof ( T ) == typeof ( CacheType ) )
75
+ cache = ( CacheType ) ( object ) ret ;
76
+ return ret ;
77
+ }
51
78
}
52
79
}
0 commit comments