// ----------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. // ----------------------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.Linq; using System.ComponentModel.Composition.Factories; using System.ComponentModel.Composition.Primitives; namespace System.ComponentModel.Composition { internal class ConcreteComposablePart : ComposablePart, IDisposable { private readonly List _exports = new List(); private readonly List _imports = new List(); private readonly IDictionary> _setImports = new Dictionary>(); public ConcreteComposablePart() { } public override IDictionary Metadata { get { return MetadataServices.EmptyMetadata; } } public IDictionary> SetImports { get { return this._setImports; } } public override IEnumerable ExportDefinitions { get { return this._exports.Select(export => export.Definition); } } public override IEnumerable ImportDefinitions { get { return this._imports; } } public ImportDefinition AddImport(string contractName, ImportCardinality cardinality, bool isRecomposable, bool isPrerequisite) { var import = ImportDefinitionFactory.CreateDefault(contractName, cardinality, isRecomposable, isPrerequisite); this.AddImport(import); return import; } public void AddImport(ImportDefinition import) { this._imports.Add(import); } public void AddExport(string contractName, object value) { this.AddExport(ExportFactory.Create(contractName, () => value)); } public void AddExport(Export export) { this._exports.Add(export); } public override object GetExportedValue(ExportDefinition definition) { Export export = _exports.First(e => e.Definition == definition); return export.Value; } public override void SetImport(ImportDefinition definition, IEnumerable exports) { ContractBasedImportDefinition contractBasedDefinition = (ContractBasedImportDefinition)definition; this._setImports[contractBasedDefinition.ContractName] = exports; foreach (Export export in exports) { var value = export.Value; } } void IDisposable.Dispose() { foreach (var disposable in _exports.Select(export => export.Value).OfType()) { disposable.Dispose(); } } } }