/// <summary> /// Sets the imports of the specified composable part exactly once and they will not /// ever be recomposed. /// </summary> /// <param name="part"> /// The <see cref="ComposablePart"/> to set the imports. /// </param> /// <exception cref="ArgumentNullException"> /// <paramref name="part"/> is <see langword="null"/>. /// </exception> /// <exception cref="CompositionException"> /// An error occurred during composition. <see cref="CompositionException.Errors"/> will /// contain a collection of errors that occurred. /// </exception> /// <exception cref="ObjectDisposedException"> /// The <see cref="ICompositionService"/> has been disposed of. /// </exception> public void SatisfyImportsOnce(ComposablePart part) { ThrowIfDisposed(); if (_importEngine == null) { ImportEngine importEngine = new ImportEngine(this, _compositionOptions); lock (_lock) { if (_importEngine == null) { Thread.MemoryBarrier(); _importEngine = importEngine; importEngine = null; } } if (importEngine != null) { importEngine.Dispose(); } } _importEngine.SatisfyImportsOnce(part); }
public void SatisfyImportsOnce_Unsuccessful_ShouldNotBlockChanges() { var exportProvider = ExportProviderFactory.CreateRecomposable(); var engine = new ImportEngine(exportProvider); var import = ImportDefinitionFactory.Create("Value"); var importer = PartFactory.CreateImporter(import); ExceptionAssert.Throws<CompositionException>(() => engine.SatisfyImportsOnce(importer)); exportProvider.AddExport("Value", 22); exportProvider.AddExport("Value", 23); exportProvider.RemoveExport("Value"); GC.KeepAlive(importer); }
public void SatisifyImportsOnce_Recomposable_ValueShouldNotChange_NoRecompositionRequested_ViaNonArgumentSignature() { 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.SatisfyImportsOnce(importer); Assert.AreEqual(21, importer.GetImport(import)); exportProvider.ReplaceExportValue("Value", 42); Assert.AreEqual(21, importer.GetImport(import), "Value should not change!"); GC.KeepAlive(importer); }