@@ -7,21 +7,26 @@ namespace GitHub.Extensions
77{
88 public static class VSExtensions
99 {
10+ static IUIProvider cachedUIProvider = null ;
11+
1012 public static T TryGetService < T > ( this IServiceProvider serviceProvider ) where T : class
1113 {
1214 return serviceProvider . TryGetService ( typeof ( T ) ) as T ;
1315 }
1416
1517 public static object TryGetService ( this IServiceProvider serviceProvider , Type type )
1618 {
19+ if ( cachedUIProvider != null && type == typeof ( IUIProvider ) )
20+ return cachedUIProvider ;
21+
1722 var ui = serviceProvider as IUIProvider ;
1823 if ( ui != null )
1924 return ui . TryGetService ( type ) ;
2025 else
2126 {
2227 try
2328 {
24- return serviceProvider . GetService ( type ) ;
29+ return GetServiceAndCache ( serviceProvider , type , ref cachedUIProvider ) ;
2530 }
2631 catch ( Exception ex )
2732 {
@@ -33,20 +38,42 @@ public static object TryGetService(this IServiceProvider serviceProvider, Type t
3338
3439 public static T GetService < T > ( this IServiceProvider serviceProvider )
3540 {
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 ) ;
3745 }
3846
3947 public static T GetExportedValue < T > ( this IServiceProvider serviceProvider )
4048 {
49+ if ( cachedUIProvider != null && typeof ( T ) == typeof ( IUIProvider ) )
50+ return ( T ) cachedUIProvider ;
51+
4152 var ui = serviceProvider as IUIProvider ;
4253 return ui != null
4354 ? ui . GetService < T > ( )
44- : VisualStudio . Services . ComponentModel . DefaultExportProvider . GetExportedValue < T > ( ) ;
55+ : GetExportedValueAndCache < T , IUIProvider > ( ref cachedUIProvider ) ;
4556 }
4657
4758 public static ITeamExplorerSection GetSection ( this IServiceProvider serviceProvider , Guid section )
4859 {
4960 return serviceProvider ? . GetService < ITeamExplorerPage > ( ) ? . GetSection ( section ) ;
5061 }
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+ }
5178 }
5279}
0 commit comments