1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
5 using System.Collections.Generic;
\r
6 using System.ComponentModel.Composition;
\r
8 using System.ComponentModel.Composition.Factories;
\r
9 using System.ComponentModel.Composition.Primitives;
\r
11 namespace System.ComponentModel.Composition
\r
13 internal class ConcreteComposablePart : ComposablePart, IDisposable
\r
15 private readonly List<Export> _exports = new List<Export>();
\r
16 private readonly List<ImportDefinition> _imports = new List<ImportDefinition>();
\r
17 private readonly IDictionary<string, IEnumerable<Export>> _setImports = new Dictionary<string, IEnumerable<Export>>();
\r
19 public ConcreteComposablePart()
\r
23 public override IDictionary<string, object> Metadata
\r
25 get { return MetadataServices.EmptyMetadata; }
\r
28 public IDictionary<string, IEnumerable<Export>> SetImports
\r
30 get { return this._setImports; }
\r
33 public override IEnumerable<ExportDefinition> ExportDefinitions
\r
35 get { return this._exports.Select(export => export.Definition); }
\r
38 public override IEnumerable<ImportDefinition> ImportDefinitions
\r
40 get { return this._imports; }
\r
43 public ImportDefinition AddImport(string contractName, ImportCardinality cardinality, bool isRecomposable, bool isPrerequisite)
\r
45 var import = ImportDefinitionFactory.CreateDefault(contractName, cardinality, isRecomposable, isPrerequisite);
\r
47 this.AddImport(import);
\r
51 public void AddImport(ImportDefinition import)
\r
53 this._imports.Add(import);
\r
56 public void AddExport(string contractName, object value)
\r
58 this.AddExport(ExportFactory.Create(contractName, () => value));
\r
61 public void AddExport(Export export)
\r
63 this._exports.Add(export);
\r
66 public override object GetExportedValue(ExportDefinition definition)
\r
68 Export export = _exports.First(e => e.Definition == definition);
\r
70 return export.Value;
\r
73 public override void SetImport(ImportDefinition definition, IEnumerable<Export> exports)
\r
75 ContractBasedImportDefinition contractBasedDefinition = (ContractBasedImportDefinition)definition;
\r
76 this._setImports[contractBasedDefinition.ContractName] = exports;
\r
78 foreach (Export export in exports)
\r
80 var value = export.Value;
\r
84 void IDisposable.Dispose()
\r
86 foreach (var disposable in _exports.Select(export => export.Value).OfType<IDisposable>())
\r
88 disposable.Dispose();
\r