Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 6ef6caa

Browse files
committed
Cache the IUIProvider, no sense looking it up every time
1 parent 067be61 commit 6ef6caa

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

src/GitHub.Exports/Extensions/VSExtensions.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)