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

Commit 9544e81

Browse files
jcansdaleStanleyGoldman
authored andcommitted
Expose singleton GitHub ExportProvider via MEF
1 parent b4e809d commit 9544e81

File tree

4 files changed

+45
-21
lines changed

4 files changed

+45
-21
lines changed

src/GitHub.VisualStudio.16/CompositionServices.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,43 @@
1717
using Microsoft.VisualStudio.Shell;
1818
using Microsoft.VisualStudio.Threading;
1919
using Rothko;
20+
using static Microsoft.VisualStudio.Composition.NetFxAdapters;
21+
using ExportProvider = System.ComponentModel.Composition.Hosting.ExportProvider;
2022

2123
namespace GitHub.VisualStudio
2224
{
25+
[Export]
2326
public class CompositionServices
2427
{
25-
public CompositionContainer CreateVisualStudioCompositionContainer(ExportProvider defaultExportProvider)
28+
readonly ExportProvider defaultExportProvider;
29+
ExportProvider exportProvider;
30+
31+
public CompositionServices()
32+
{
33+
}
34+
35+
[ImportingConstructor]
36+
public CompositionServices(Microsoft.VisualStudio.Composition.ExportProvider defaultExportProvider)
37+
{
38+
this.defaultExportProvider = defaultExportProvider.AsExportProvider();
39+
}
40+
41+
public ExportProvider GetExportProvider()
42+
{
43+
return exportProvider = exportProvider ?? CreateCompositionContainer();
44+
}
45+
46+
CompositionContainer CreateCompositionContainer()
47+
{
48+
if (defaultExportProvider is ExportProvider exportProvider)
49+
{
50+
return CreateVisualStudioCompositionContainer(exportProvider);
51+
}
52+
53+
return CreateOutOfProcCompositionContainer();
54+
}
55+
56+
static CompositionContainer CreateVisualStudioCompositionContainer(ExportProvider defaultExportProvider)
2657
{
2758
var compositionContainer = CreateCompositionContainer(defaultExportProvider);
2859

@@ -34,7 +65,7 @@ public CompositionContainer CreateVisualStudioCompositionContainer(ExportProvide
3465
return compositionContainer;
3566
}
3667

37-
public CompositionContainer CreateOutOfProcCompositionContainer()
68+
static CompositionContainer CreateOutOfProcCompositionContainer()
3869
{
3970
var compositionContainer = CreateCompositionContainer(CreateOutOfProcExports());
4071

src/GitHub.VisualStudio.16/InBoxExtensionServices.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ async Task<CodeContainer> RunAcquisitionAsync(IProgress<ServiceProgressData> dow
7272
static async Task<CloneDialogResult> ShowCloneDialogAsync(IComponentModel componentModel,
7373
IProgress<ServiceProgressData> downloadProgress, CancellationToken cancellationToken, string url = null)
7474
{
75-
var compositionServices = new CompositionServices();
76-
var compositionContainer = compositionServices.CreateVisualStudioCompositionContainer(componentModel.DefaultExportProvider);
75+
var compositionServices = componentModel.DefaultExportProvider.GetExportedValue<CompositionServices>();
76+
var exportProvider = compositionServices.GetExportProvider();
7777

78-
var dialogService = compositionContainer.GetExportedValue<IDialogService>();
78+
var dialogService = exportProvider.GetExportedValue<IDialogService>();
7979
var cloneDialogResult = await dialogService.ShowCloneDialog(null, url);
8080
if (cloneDialogResult != null)
8181
{
82-
var repositoryCloneService = compositionContainer.GetExportedValue<IRepositoryCloneService>();
82+
var repositoryCloneService = exportProvider.GetExportedValue<IRepositoryCloneService>();
8383
await repositoryCloneService.CloneOrOpenRepository(cloneDialogResult, downloadProgress, cancellationToken);
8484
return cloneDialogResult;
8585
}

src/GitHub.VisualStudio.16/Sync/PublishSection.cs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@
1010
using GitHub.ViewModels.TeamExplorer;
1111
using GitHub.VisualStudio;
1212
using Microsoft.TeamFoundation.Controls;
13-
using Microsoft.VisualStudio.Composition;
1413
using ReactiveUI;
15-
using ExportProvider = System.ComponentModel.Composition.Hosting.ExportProvider;
1614

1715

1816
namespace Microsoft.TeamExplorerSample.Sync
@@ -23,7 +21,7 @@ namespace Microsoft.TeamExplorerSample.Sync
2321
[TeamExplorerSection(SectionId, TeamExplorerPageIds.GitCommits, Priority)]
2422
public class PublishSection : TeamExplorerBaseSection
2523
{
26-
readonly ExportProvider defaultExportProvider;
24+
readonly CompositionServices compositionServices;
2725

2826
public const string SectionId = "35B18474-005D-4A2A-9CCF-FFFFEB60F1F5";
2927
public const int Priority = 4;
@@ -32,9 +30,9 @@ public class PublishSection : TeamExplorerBaseSection
3230
readonly Guid GitHubPublishSectionId = new Guid("92655B52-360D-4BF5-95C5-D9E9E596AC76");
3331

3432
[ImportingConstructor]
35-
public PublishSection(VisualStudio.Composition.ExportProvider defaultExportProvider)
33+
public PublishSection(CompositionServices compositionServices)
3634
{
37-
this.defaultExportProvider = defaultExportProvider.AsExportProvider();
35+
this.compositionServices = compositionServices;
3836

3937
this.Title = "Publish to GitHub";
4038
this.IsExpanded = true;
@@ -82,7 +80,7 @@ public override void Initialize(object sender, SectionInitializeEventArgs e)
8280

8381
void ShowPublishDialog()
8482
{
85-
var exportProvider = GetExportProvider();
83+
var exportProvider = compositionServices.GetExportProvider();
8684

8785
var factory = exportProvider.GetExportedValue<IViewViewModelFactory>();
8886
var viewModel = exportProvider.GetExportedValue<IRepositoryPublishViewModel>();
@@ -112,13 +110,6 @@ void ShowPublishDialog()
112110
SectionContent = view;
113111
}
114112

115-
ExportProvider GetExportProvider()
116-
{
117-
var compositionServices = new CompositionServices();
118-
var compositionContainer = compositionServices.CreateVisualStudioCompositionContainer(defaultExportProvider);
119-
return compositionContainer;
120-
}
121-
122113
void Section_PropertyChanged(object sender, PropertyChangedEventArgs e)
123114
{
124115
switch (e.PropertyName)

src/GitHub.VisualStudio.TestApp/MainWindow.xaml.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,13 @@ async Task CloneOrOpenRepositoryAsync()
7171
CompositionContainer CreateCompositionContainer()
7272
{
7373
var compositionServices = new CompositionServices();
74-
var compositionContainer = compositionServices.CreateOutOfProcCompositionContainer();
74+
var exportProvider = compositionServices.GetExportProvider();
7575

76-
var gitHubServiceProvider = compositionContainer.GetExportedValue<IGitHubServiceProvider>();
76+
var compositionContainer = new CompositionContainer(exportProvider);
77+
var gitHubServiceProvider = exportProvider.GetExportedValue<IGitHubServiceProvider>();
7778
var externalShowDialogService = new ExternalShowDialogService(gitHubServiceProvider, this);
7879
compositionContainer.ComposeExportedValue<IShowDialogService>(externalShowDialogService);
80+
7981
return compositionContainer;
8082
}
8183
}

0 commit comments

Comments
 (0)