| File: System\ComponentModel\Composition\Hosting\CatalogExportProvider.FactoryExport.cs | Web Access |
| Project: src\runtime\src\libraries\System.ComponentModel.Composition\src\System.ComponentModel.Composition.csproj (System.ComponentModel.Composition) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.ComponentModel.Composition.Primitives; using System.ComponentModel.Composition.ReflectionModel; using System.Linq; namespace System.ComponentModel.Composition.Hosting { public partial class CatalogExportProvider { internal abstract class FactoryExport : Export { private readonly ComposablePartDefinition _partDefinition; private readonly ExportDefinition _exportDefinition; private readonly ExportDefinition _factoryExportDefinition; private FactoryExportPartDefinition? _factoryExportPartDefinition; public FactoryExport(ComposablePartDefinition partDefinition, ExportDefinition exportDefinition) { _partDefinition = partDefinition; _exportDefinition = exportDefinition; _factoryExportDefinition = new PartCreatorExportDefinition(_exportDefinition); } public override ExportDefinition Definition { get { return _factoryExportDefinition; } } protected override object GetExportedValueCore() => _factoryExportPartDefinition ??= new FactoryExportPartDefinition(this); protected ComposablePartDefinition UnderlyingPartDefinition { get { return _partDefinition; } } protected ExportDefinition UnderlyingExportDefinition { get { return _exportDefinition; } } public abstract Export CreateExportProduct(); private sealed class FactoryExportPartDefinition : ComposablePartDefinition { private readonly FactoryExport _FactoryExport; public FactoryExportPartDefinition(FactoryExport FactoryExport) { _FactoryExport = FactoryExport; } public override IEnumerable<ExportDefinition> ExportDefinitions { get { return new ExportDefinition[] { _FactoryExport.Definition }; } } public override IEnumerable<ImportDefinition> ImportDefinitions { get { return Enumerable.Empty<ImportDefinition>(); } } public ExportDefinition FactoryExportDefinition { get { return _FactoryExport.Definition; } } public Export CreateProductExport() { return _FactoryExport.CreateExportProduct(); } public override ComposablePart CreatePart() { return new FactoryExportPart(this); } } private sealed class FactoryExportPart : ComposablePart, IDisposable { private readonly FactoryExportPartDefinition _definition; private readonly Export _export; public FactoryExportPart(FactoryExportPartDefinition definition) { _definition = definition; _export = definition.CreateProductExport(); } public override IEnumerable<ExportDefinition> ExportDefinitions { get { return _definition.ExportDefinitions; } } public override IEnumerable<ImportDefinition> ImportDefinitions { get { return _definition.ImportDefinitions; } } public override object? GetExportedValue(ExportDefinition definition) { if (definition != _definition.FactoryExportDefinition) { throw ExceptionBuilder.CreateExportDefinitionNotOnThisComposablePart(nameof(definition)); } return _export.Value; } public override void SetImport(ImportDefinition definition, IEnumerable<Export> exports) { throw ExceptionBuilder.CreateImportDefinitionNotOnThisComposablePart(nameof(definition)); } public void Dispose() { if (_export is IDisposable disposable) { disposable.Dispose(); } } } } } }