private void DisposePart(object?exportedValue, CatalogPart catalogPart, AtomicComposition?atomicComposition) { ArgumentNullException.ThrowIfNull(catalogPart); if (_isDisposed) { return; } ImportEngine?importEngine = null; using (_lock.LockStateForWrite()) { if (_isDisposed) { return; } importEngine = _importEngine; } importEngine?.ReleaseImports(catalogPart.Part, atomicComposition); if (exportedValue != null) { atomicComposition.AddCompleteActionAllowNull(() => { AllowPartCollection(exportedValue); }); } if (catalogPart.Part is IDisposable diposablePart) { atomicComposition.AddCompleteActionAllowNull(() => { bool removed = false; if (_isDisposed) { return; } using (_lock.LockStateForWrite()) { if (_isDisposed) { return; } removed = _partsToDispose.Remove(diposablePart); } if (removed) { diposablePart.Dispose(); } }); } }
private void DisposePart(object exportedValue, CatalogPart catalogPart, AtomicComposition atomicComposition) { Assumes.NotNull(catalogPart); if (_isDisposed) { return; } ImportEngine importEngine = null; using (_lock.LockStateForWrite()) { if (_isDisposed) { return; } importEngine = _importEngine; } if (importEngine != null) { importEngine.ReleaseImports(catalogPart.Part, atomicComposition); } if (exportedValue != null) { atomicComposition.AddCompleteActionAllowNull(() => { AllowPartCollection(exportedValue); }); } IDisposable diposablePart = catalogPart.Part as IDisposable; if (diposablePart != null) { atomicComposition.AddCompleteActionAllowNull(() => { bool removed = false; if (_isDisposed) { return; } using (_lock.LockStateForWrite()) { if (_isDisposed) { return; } removed = _partsToDispose.Remove(diposablePart); } if (removed) { diposablePart.Dispose(); } }); } }
public void SatisfyImports_Recomposable_Unregister_ValueShouldChangeOnce() { var exportProvider = ExportProviderFactory.CreateRecomposable(); var engine = new ImportEngine(exportProvider); exportProvider.AddExport("Value", 21); var import = ImportDefinitionFactory.Create("Value", true); var importer = PartFactory.CreateImporter(import); engine.SatisfyImports(importer); Assert.AreEqual(21, importer.GetImport(import)); exportProvider.ReplaceExportValue("Value", 42); Assert.AreEqual(42, importer.GetImport(import), "Value should change!"); engine.ReleaseImports(importer, null); exportProvider.ReplaceExportValue("Value", 666); Assert.AreEqual(42, importer.GetImport(import), "Value should not change!"); GC.KeepAlive(importer); }
public void PreviewImports_ReleaseImports_ShouldNotBlockChanges() { var exportProvider = ExportProviderFactory.CreateRecomposable(); var engine = new ImportEngine(exportProvider); var import = ImportDefinitionFactory.Create("Value"); var importer = PartFactory.CreateImporter(import); exportProvider.AddExport("Value", 21); engine.PreviewImports(importer, null); ExceptionAssert.Throws<ChangeRejectedException>(() => exportProvider.AddExport("Value", 22)); ExceptionAssert.Throws<ChangeRejectedException>(() => exportProvider.RemoveExport("Value")); engine.ReleaseImports(importer, null); exportProvider.AddExport("Value", 22); exportProvider.RemoveExport("Value"); GC.KeepAlive(importer); }