| File: System\ComponentModel\Composition\ReflectionModel\ExportfactoryCreator.LifetimeContext.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.ComponentModel.Composition.Hosting; using System.ComponentModel.Composition.Primitives; using System.Linq; namespace System.ComponentModel.Composition.ReflectionModel { internal sealed partial class ExportFactoryCreator { private sealed class LifetimeContext { public static Tuple<T, Action> GetExportLifetimeContextFromExport<T>(Export export) { T exportedValue; Action disposeAction; IDisposable? disposable = null; if (export is CatalogExportProvider.ScopeFactoryExport scopeFactoryExport) { // Scoped PartCreatorExport Export exportProduct = scopeFactoryExport.CreateExportProduct(); exportedValue = ExportServices.GetCastedExportedValue<T>(exportProduct); disposable = exportProduct as IDisposable; } else { if (export is CatalogExportProvider.FactoryExport factoryExport) { // PartCreatorExport is the more optimized route Export exportProduct = factoryExport.CreateExportProduct(); exportedValue = ExportServices.GetCastedExportedValue<T>(exportProduct); disposable = exportProduct as IDisposable; } else { // If it comes from somewhere else we walk through the ComposablePartDefinition var factoryPartDefinition = ExportServices.GetCastedExportedValue<ComposablePartDefinition>(export); var part = factoryPartDefinition.CreatePart(); var exportDef = factoryPartDefinition.ExportDefinitions.Single(); exportedValue = ExportServices.CastExportedValue<T>(part.ToElement(), part.GetExportedValue(exportDef)); disposable = part as IDisposable; } } if (disposable != null) { disposeAction = disposable.Dispose; } else { disposeAction = () => { }; } return new Tuple<T, Action>(exportedValue, disposeAction); } } } }