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;
            }
        }
示例#4
0
        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);
        }