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

Commit 3e4f2bb

Browse files
committed
Create MEF factory for all exported services
1 parent 804f3b3 commit 3e4f2bb

File tree

7 files changed

+34
-178
lines changed

7 files changed

+34
-178
lines changed

src/GitHub.VisualStudio/GitHub.VisualStudio.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,6 @@
327327
<Compile Include="Services\ShowDialogService.cs" />
328328
<Compile Include="Services\UsageService.cs" />
329329
<Compile Include="Services\UsageTracker.cs" />
330-
<Compile Include="Services\LoginManagerDispatcher.cs" />
331-
<Compile Include="Services\UsageTrackerDispatcher.cs" />
332330
<Compile Include="Services\VSGitExtFactory.cs" />
333331
<Compile Include="Settings\Constants.cs" />
334332
<Compile Include="Services\ConnectionManager.cs" />

src/GitHub.VisualStudio/GitHubPackage.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using GitHub.Api;
99
using GitHub.Extensions;
1010
using GitHub.Info;
11+
using GitHub.Exports;
1112
using GitHub.Logging;
1213
using GitHub.Models;
1314
using GitHub.Services;
@@ -104,6 +105,38 @@ public GHClient(IProgram program)
104105
}
105106
}
106107

108+
[PartCreationPolicy(CreationPolicy.Shared)]
109+
public class ServiceProviderExports
110+
{
111+
// Only export services for the Visual Studio process (they don't work in Expression Blend).
112+
const string ProcessName = "devenv";
113+
114+
readonly IServiceProvider serviceProvider;
115+
116+
[ImportingConstructor]
117+
public ServiceProviderExports([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider)
118+
{
119+
this.serviceProvider = serviceProvider;
120+
}
121+
122+
[ExportForProcess(typeof(ILoginManager), ProcessName)]
123+
public ILoginManager LoginManager => GetService<ILoginManager>();
124+
125+
[ExportForProcess(typeof(IMenuProvider), ProcessName)]
126+
public IMenuProvider MenuProvider => GetService<IMenuProvider>();
127+
128+
[ExportForProcess(typeof(IGitHubServiceProvider), ProcessName)]
129+
public IGitHubServiceProvider GitHubServiceProvider => GetService<IGitHubServiceProvider>();
130+
131+
[ExportForProcess(typeof(IUsageTracker), ProcessName)]
132+
public IUsageTracker UsageTracker => GetService<IUsageTracker>();
133+
134+
[ExportForProcess(typeof(IVSGitExt), ProcessName)]
135+
public IVSGitExt VSGitExt => GetService<IVSGitExt>();
136+
137+
T GetService<T>() => (T)serviceProvider.GetService(typeof(T));
138+
}
139+
107140
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
108141
[ProvideService(typeof(ILoginManager), IsAsyncQueryable = true)]
109142
[ProvideService(typeof(IMenuProvider), IsAsyncQueryable = true)]

src/GitHub.VisualStudio/Menus/MenuProvider.cs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,8 @@
1-
using GitHub.Exports;
2-
using GitHub.Services;
1+
using GitHub.Services;
32
using System.Collections.Generic;
4-
using System.Collections.ObjectModel;
5-
using System.ComponentModel.Composition;
6-
using System.Linq;
7-
using System;
8-
using Microsoft.VisualStudio.Shell;
93

104
namespace GitHub.VisualStudio.Menus
115
{
12-
/// <summary>
13-
/// This is a thin MEF wrapper around the MenuProvider
14-
/// which is registered as a global VS service. This class just
15-
/// redirects every request to the actual service, and can be
16-
/// thrown away as soon as the caller is done (no state is kept)
17-
/// </summary>
18-
[ExportForProcess(typeof(IMenuProvider), "devenv")]
19-
[PartCreationPolicy(CreationPolicy.NonShared)]
20-
public class MenuProviderDispatcher : IMenuProvider
21-
{
22-
readonly IMenuProvider theRealProvider;
23-
24-
[ImportingConstructor]
25-
public MenuProviderDispatcher([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider)
26-
{
27-
theRealProvider = serviceProvider.GetService(typeof(IMenuProvider)) as IMenuProvider;
28-
}
29-
30-
public IReadOnlyCollection<IDynamicMenuHandler> DynamicMenus => theRealProvider.DynamicMenus;
31-
32-
public IReadOnlyCollection<IMenuHandler> Menus => theRealProvider.Menus;
33-
}
34-
356
internal class MenuProvider : IMenuProvider
367
{
378
public IReadOnlyCollection<IMenuHandler> Menus { get; }

src/GitHub.VisualStudio/Services/GitHubServiceProvider.cs

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -21,58 +21,6 @@
2121

2222
namespace GitHub.VisualStudio
2323
{
24-
/// <summary>
25-
/// This is a thin MEF wrapper around the GitHubServiceProvider
26-
/// which is registered as a global VS service. This class just
27-
/// redirects every request to the actual service, and can be
28-
/// thrown away as soon as the caller is done (no state is kept)
29-
/// </summary>
30-
[ExportForProcess(typeof(IGitHubServiceProvider), "devenv")]
31-
[PartCreationPolicy(CreationPolicy.NonShared)]
32-
public class GitHubProviderDispatcher : IGitHubServiceProvider
33-
{
34-
readonly IGitHubServiceProvider theRealProvider;
35-
36-
[ImportingConstructor]
37-
public GitHubProviderDispatcher([Import(typeof(SVsServiceProvider))] IServiceProvider serviceProvider)
38-
{
39-
theRealProvider = serviceProvider.GetService(typeof(IGitHubServiceProvider)) as IGitHubServiceProvider;
40-
}
41-
42-
public ExportProvider ExportProvider => theRealProvider.ExportProvider;
43-
44-
public IServiceProvider GitServiceProvider
45-
{
46-
get
47-
{
48-
return theRealProvider.GitServiceProvider;
49-
}
50-
51-
set
52-
{
53-
theRealProvider.GitServiceProvider = value;
54-
}
55-
}
56-
57-
public void AddService(Type t, object owner, object instance) => theRealProvider.AddService(t, owner, instance);
58-
59-
public void AddService<T>(object owner, T instance) where T : class => theRealProvider.AddService(owner, instance);
60-
61-
public T GetService<T>() where T : class => theRealProvider.GetService<T>();
62-
63-
public object GetService(Type serviceType) => theRealProvider.GetService(serviceType);
64-
65-
public Ret GetService<T, Ret>() where T : class where Ret : class => theRealProvider.GetService<T, Ret>();
66-
67-
public void RemoveService(Type t, object owner) => theRealProvider.RemoveService(t, owner);
68-
69-
public object TryGetService(string typename) => theRealProvider.TryGetService(typename);
70-
71-
public object TryGetService(Type t) => theRealProvider.TryGetService(t);
72-
73-
public T TryGetService<T>() where T : class => theRealProvider.TryGetService<T>();
74-
}
75-
7624
/// <summary>
7725
/// This is a globally registered service (see `GitHubPackage`).
7826
/// If you need to access this service via MEF, use the `IGitHubServiceProvider` type

src/GitHub.VisualStudio/Services/LoginManagerDispatcher.cs

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/GitHub.VisualStudio/Services/UsageTrackerDispatcher.cs

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/GitHub.VisualStudio/Services/VSGitExtFactory.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
extern alias TF15;
33

44
using System;
5-
using System.ComponentModel.Composition;
6-
using GitHub.Info;
75
using GitHub.Logging;
86
using Serilog;
97
using Microsoft.VisualStudio.Shell;
@@ -12,17 +10,10 @@
1210

1311
namespace GitHub.Services
1412
{
15-
[PartCreationPolicy(CreationPolicy.Shared)]
1613
public class VSGitExtFactory
1714
{
1815
static readonly ILogger log = LogManager.ForContext<VSGitExtFactory>();
1916

20-
[ImportingConstructor]
21-
public VSGitExtFactory(IGitHubServiceProvider serviceProvider)
22-
{
23-
VSGitExt = serviceProvider.GetService<IVSGitExt>();
24-
}
25-
2617
public static IVSGitExt Create(int vsVersion, IAsyncServiceProvider sp)
2718
{
2819
switch (vsVersion)
@@ -40,8 +31,5 @@ public static IVSGitExt Create(int vsVersion, IAsyncServiceProvider sp)
4031
// NOTE: We're being careful to only reference VSGitExt14 and VSGitExt15 from inside a lambda expression.
4132
// This ensures that only the type that's compatible with the running DTE version is loaded.
4233
static IVSGitExt Create(Func<IVSGitExt> factory) => factory.Invoke();
43-
44-
[Export]
45-
public IVSGitExt VSGitExt { get; }
4634
}
4735
}

0 commit comments

Comments
 (0)