public override void Activate() { IDictionary <string, Lazy <object> > valuesLazy = ImportValues.ToDictionary( x => x.Key.MemberName, v => v.Value); if (CachedInstance == null && this.Definition.ParameterlessConstructor) { _cachedInstance = CustomActivator.CreateInstance(Definition.GetPartType()); var unpackValues = valuesLazy.ToDictionary(k => k.Key, v => v.Value.Value); CustomActivator.PopulateObjectProperties(_cachedInstance, unpackValues); } else if (this.Definition.ParameterlessConstructor) { var unpackValues = valuesLazy.ToDictionary(k => k.Key, v => v.Value.Value); CustomActivator.PopulateObjectProperties(_cachedInstance, unpackValues); } else { var constructor = Definition.GetConstructor(); var requiredParameters = constructor.GetParameters(); //Sorting imports to match constructor order object[] unpackValues = new SortedDictionary <string, Lazy <object> >(valuesLazy) .Zip(requiredParameters, (lazyValues, required) => new { lazyValues, required }) .OrderBy(x => x.required.Name) .Select(x => x.lazyValues.Value.Value) .ToArray <object>(); _cachedInstance = Definition.GetConstructor().Invoke(unpackValues); } }
private bool TryGetImportValue(ImportDefinition definition, out object value) { lock (_lock) { if (_importValues != null && ImportValues.TryGetValue(definition, out value)) { ImportValues.Remove(definition); return(true); } } value = null; return(false); }
// this is called under a lock private void EnsureGettable() { // If we're already composed then we know that // all pre-req imports have been satisfied if (_initialCompositionComplete) { return; } // Make sure all pre-req imports have been set foreach (ImportDefinition definition in ImportDefinitions.Where(definition => definition.IsPrerequisite)) { if (_importValues == null || !ImportValues.ContainsKey(definition)) { throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, SR.InvalidOperation_GetExportedValueBeforePrereqImportSet, definition.ToElement().DisplayName)); } } }