public bool TryGetSingleForExport(CompositionContract exportKey, out ExportDescriptor defaultForExport) { ExportDescriptor[] allForExport; if (!_partDefinitions.TryGetValue(exportKey, out allForExport)) { lock (_thisLock) { if (!_partDefinitions.ContainsKey(exportKey)) { var updatedDefinitions = new Dictionary<CompositionContract, ExportDescriptor[]>(_partDefinitions); var updateOperation = new ExportDescriptorRegistryUpdate(updatedDefinitions, _exportDescriptorProviders); updateOperation.Execute(exportKey); _partDefinitions = updatedDefinitions; } } allForExport = (ExportDescriptor[])_partDefinitions[exportKey]; } if (allForExport.Length == 0) { defaultForExport = null; return false; } // This check is duplicated in the update process- the update operation will catch // cardinality violations in advance of this in all but a few very rare scenarios. if (allForExport.Length != 1) throw ThrowHelper.CardinalityMismatch_TooManyExports(exportKey.ToString()); defaultForExport = allForExport[0]; return true; }
/// <summary> /// Retrieve the promised export descriptor. /// </summary> /// <returns>The export descriptor.</returns> public ExportDescriptor GetDescriptor() { if (_creating && !_descriptor.IsValueCreated) { return(new CycleBreakingExportDescriptor(_descriptor)); } _creating = true; try { ExportDescriptor relay = _descriptor.Value; Requires.NotNull(relay, "descriptor"); return(relay); } finally { _creating = false; } }
/// <summary> /// Retrieve the promised export descriptor. /// </summary> /// <returns>The export descriptor.</returns> public ExportDescriptor GetDescriptor() { if (_creating && !_descriptor.IsValueCreated) return new CycleBreakingExportDescriptor(_descriptor); _creating = true; try { ExportDescriptor relay = _descriptor.Value; if(relay == null) { throw new ArgumentNullException("descriptor"); } return relay; } finally { _creating = false; } }
public bool TryGetSingleForExport(CompositionContract exportKey, out ExportDescriptor defaultForExport) { ExportDescriptor[] allForExport; if (!_partDefinitions.TryGetValue(exportKey, out allForExport)) { lock (_thisLock) { if (!_partDefinitions.ContainsKey(exportKey)) { var updatedDefinitions = new Dictionary <CompositionContract, ExportDescriptor[]>(_partDefinitions); var updateOperation = new ExportDescriptorRegistryUpdate(updatedDefinitions, _exportDescriptorProviders); updateOperation.Execute(exportKey); _partDefinitions = updatedDefinitions; } } allForExport = (ExportDescriptor[])_partDefinitions[exportKey]; } if (allForExport.Length == 0) { defaultForExport = null; return(false); } // This check is duplicated in the update process- the update operation will catch // cardinality violations in advance of this in all but a few very rare scenarios. if (allForExport.Length != 1) { var ex = new CompositionFailedException(SR.Format(SR.CardinalityMismatch_TooManyExports, exportKey.ToString())); Debug.WriteLine(SR.Diagnostic_ThrowingException, ex.ToString()); throw ex; } defaultForExport = allForExport[0]; return(true); }