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

Commit ecab1bb

Browse files
committed
Cleanup the ServiceProvider extension methods
1 parent b995428 commit ecab1bb

File tree

1 file changed

+30
-36
lines changed

1 file changed

+30
-36
lines changed

src/GitHub.Exports/Extensions/ServiceProviderExtensions.cs

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,50 +15,35 @@ public static class IServiceProviderExtensions
1515
{
1616
static IUIProvider cachedUIProvider = null;
1717

18-
public static T TryGetService<T>(this IServiceProvider serviceProvider) where T : class
19-
{
20-
return serviceProvider.TryGetService(typeof(T)) as T;
21-
}
22-
2318
public static object TryGetService(this IServiceProvider serviceProvider, Type type)
2419
{
2520
if (cachedUIProvider != null && type == typeof(IUIProvider))
2621
return cachedUIProvider;
2722

2823
var ui = serviceProvider as IUIProvider;
29-
if (ui != null)
30-
return ui.TryGetService(type);
31-
else
32-
{
33-
try
34-
{
35-
return GetServiceAndCache(serviceProvider, type, ref cachedUIProvider);
36-
}
37-
catch (Exception ex)
38-
{
39-
Debug.Print(ex.ToString());
40-
}
41-
return null;
42-
}
24+
return ui != null
25+
? ui.TryGetService(type)
26+
: GetServiceAndCache(serviceProvider, type, ref cachedUIProvider);
4327
}
44-
45-
public static T GetService<T>(this IServiceProvider serviceProvider)
28+
public static T GetExportedValue<T>(this IServiceProvider serviceProvider) where T : class
4629
{
4730
if (cachedUIProvider != null && typeof(T) == typeof(IUIProvider))
4831
return (T)cachedUIProvider;
4932

50-
return (T)GetServiceAndCache(serviceProvider, typeof(T), ref cachedUIProvider);
33+
var ui = serviceProvider as IUIProvider;
34+
return ui != null
35+
? ui.TryGetService(typeof(T)) as T
36+
: GetExportedValueAndCache<T, IUIProvider>(ref cachedUIProvider);
5137
}
5238

53-
public static T GetExportedValue<T>(this IServiceProvider serviceProvider)
39+
public static T TryGetService<T>(this IServiceProvider serviceProvider) where T : class
5440
{
55-
if (cachedUIProvider != null && typeof(T) == typeof(IUIProvider))
56-
return (T)cachedUIProvider;
41+
return serviceProvider.TryGetService(typeof(T)) as T;
42+
}
5743

58-
var ui = serviceProvider as IUIProvider;
59-
return ui != null
60-
? ui.GetService<T>()
61-
: GetExportedValueAndCache<T, IUIProvider>(ref cachedUIProvider);
44+
public static T GetService<T>(this IServiceProvider serviceProvider) where T : class
45+
{
46+
return serviceProvider.TryGetService(typeof(T)) as T;
6247
}
6348

6449
public static ITeamExplorerSection GetSection(this IServiceProvider serviceProvider, Guid section)
@@ -68,18 +53,27 @@ public static ITeamExplorerSection GetSection(this IServiceProvider serviceProvi
6853

6954
static object GetServiceAndCache<CacheType>(IServiceProvider provider, Type type, ref CacheType cache)
7055
{
71-
var ret = provider.GetService(type);
72-
if (type == typeof(CacheType))
56+
object ret = null;
57+
try
58+
{
59+
ret = provider.GetService(type);
60+
}
61+
catch (Exception ex)
62+
{
63+
Debug.Print(ex.ToString());
64+
VisualStudio.VsOutputLogger.WriteLine("GetServiceAndCache: Could not obtain instance of '{0}'", type);
65+
}
66+
if (ret != null && type == typeof(CacheType))
7367
cache = (CacheType)ret;
7468
return ret;
7569
}
7670

77-
static T GetExportedValueAndCache<T, CacheType>(ref CacheType cache)
71+
static T GetExportedValueAndCache<T, CacheType>(ref CacheType cache) where T : class
7872
{
79-
var ret = VisualStudio.Services.ComponentModel.DefaultExportProvider.GetExportedValue<T>();
80-
if (typeof(T) == typeof(CacheType))
81-
cache = (CacheType)(object)ret;
82-
return ret;
73+
object ret = VisualStudio.Services.ComponentModel.DefaultExportProvider.GetExportedValueOrDefault<T>();
74+
if (ret != null && typeof(T) == typeof(CacheType))
75+
cache = (CacheType)ret;
76+
return ret as T;
8377
}
8478

8579
public static void AddTopLevelMenuItem(this IServiceProvider provider,

0 commit comments

Comments
 (0)