1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections.Generic;
\r
6 using System.ComponentModel.Composition.Primitives;
\r
7 using System.Diagnostics;
\r
8 using System.Diagnostics.CodeAnalysis;
\r
9 using System.Globalization;
\r
11 using System.Runtime.CompilerServices;
\r
12 using System.Threading;
\r
13 using Microsoft.Internal;
\r
14 using Microsoft.Internal.Collections;
\r
16 namespace System.ComponentModel.Composition.Hosting
\r
18 public partial class CatalogExportProvider : ExportProvider, IDisposable
\r
20 private class CatalogChangeProxy : ComposablePartCatalog
\r
22 private ComposablePartCatalog _originalCatalog;
\r
23 private List<ComposablePartDefinition> _addedParts;
\r
24 private HashSet<ComposablePartDefinition> _removedParts;
\r
26 public CatalogChangeProxy(ComposablePartCatalog originalCatalog,
\r
27 IEnumerable<ComposablePartDefinition> addedParts,
\r
28 IEnumerable<ComposablePartDefinition> removedParts)
\r
30 this._originalCatalog = originalCatalog;
\r
31 this._addedParts = new List<ComposablePartDefinition>(addedParts);
\r
32 this._removedParts = new HashSet<ComposablePartDefinition>(removedParts);
\r
35 public override IQueryable<ComposablePartDefinition> Parts
\r
39 return this._originalCatalog.Parts.Concat(this._addedParts).Except(this._removedParts);
\r
43 public override IEnumerable<Tuple<ComposablePartDefinition, ExportDefinition>> GetExports(
\r
44 ImportDefinition definition)
\r
46 Requires.NotNull(definition, "definition");
\r
48 var originalExports = this._originalCatalog.GetExports(definition);
\r
49 var trimmedExports = originalExports.Where(partAndExport =>
\r
50 !this._removedParts.Contains(partAndExport.Item1));
\r
52 var addedExports = new List<Tuple<ComposablePartDefinition, ExportDefinition>>();
\r
53 foreach (var part in this._addedParts)
\r
55 foreach (var export in part.ExportDefinitions)
\r
57 if (definition.IsConstraintSatisfiedBy(export))
\r
59 addedExports.Add(new Tuple<ComposablePartDefinition, ExportDefinition>(part, export));
\r
63 return trimmedExports.Concat(addedExports);
\r