internal WorkflowInstanceExtensionCollection(Activity workflowDefinition, WorkflowInstanceExtensionManager extensionManager) { Dictionary <Type, WorkflowInstanceExtensionProvider> dictionary; HashSet <Type> set; this.extensionManager = extensionManager; int capacity = 0; if (extensionManager != null) { capacity = extensionManager.ExtensionProviders.Count; this.hasTrackingParticipant = extensionManager.HasSingletonTrackingParticipant; this.hasPersistenceModule = extensionManager.HasSingletonPersistenceModule; this.allSingletonExtensions = this.extensionManager.GetAllSingletonExtensions(); } else { this.allSingletonExtensions = WorkflowInstanceExtensionManager.EmptySingletonExtensions; } Dictionary <Type, WorkflowInstanceExtensionProvider> dictionary2 = null; if (workflowDefinition.GetActivityExtensionInformation(out dictionary, out set)) { HashSet <Type> extensionTypes = new HashSet <Type>(); if (extensionManager != null) { extensionManager.AddAllExtensionTypes(extensionTypes); } if (dictionary != null) { dictionary2 = new Dictionary <Type, WorkflowInstanceExtensionProvider>(dictionary.Count); foreach (KeyValuePair <Type, WorkflowInstanceExtensionProvider> pair in dictionary) { Type key = pair.Key; if (!System.Runtime.TypeHelper.ContainsCompatibleType(extensionTypes, key)) { List <Type> list = null; bool flag = false; foreach (Type type2 in dictionary2.Keys) { if (System.Runtime.TypeHelper.AreReferenceTypesCompatible(type2, key)) { flag = true; break; } if (System.Runtime.TypeHelper.AreReferenceTypesCompatible(key, type2)) { if (list == null) { list = new List <Type>(); } list.Add(type2); } } if (list != null) { for (int i = 0; i < list.Count; i++) { dictionary2.Remove(list[i]); } } if (!flag) { dictionary2.Add(key, pair.Value); } } } if (dictionary2.Count > 0) { extensionTypes.UnionWith(dictionary2.Keys); capacity += dictionary2.Count; } } if ((set != null) && (set.Count > 0)) { foreach (Type type3 in set) { if (!System.Runtime.TypeHelper.ContainsCompatibleType(extensionTypes, type3)) { throw FxTrace.Exception.AsError(new ValidationException(System.Activities.SR.RequiredExtensionTypeNotFound(type3.ToString()))); } } } } if (capacity > 0) { this.instanceExtensions = new List <KeyValuePair <WorkflowInstanceExtensionProvider, object> >(capacity); if (extensionManager != null) { List <KeyValuePair <Type, WorkflowInstanceExtensionProvider> > extensionProviders = extensionManager.ExtensionProviders; for (int j = 0; j < extensionProviders.Count; j++) { KeyValuePair <Type, WorkflowInstanceExtensionProvider> pair2 = extensionProviders[j]; this.AddInstanceExtension(pair2.Value); } } if (dictionary2 != null) { foreach (WorkflowInstanceExtensionProvider provider in dictionary2.Values) { this.AddInstanceExtension(provider); } } } }
internal WorkflowInstanceExtensionCollection(Activity workflowDefinition, WorkflowInstanceExtensionManager extensionManager) { this.extensionManager = extensionManager; int extensionProviderCount = 0; if (extensionManager != null) { extensionProviderCount = extensionManager.ExtensionProviders.Count; this.hasTrackingParticipant = extensionManager.HasSingletonTrackingParticipant; this.hasPersistenceModule = extensionManager.HasSingletonPersistenceModule; // create an uber-IEnumerable to simplify our iteration code this.allSingletonExtensions = this.extensionManager.GetAllSingletonExtensions(); } else { this.allSingletonExtensions = WorkflowInstanceExtensionManager.EmptySingletonExtensions; } // Resolve activity extensions Dictionary <Type, WorkflowInstanceExtensionProvider> filteredActivityExtensionProviders = null; if (workflowDefinition.GetActivityExtensionInformation(out Dictionary <Type, WorkflowInstanceExtensionProvider> activityExtensionProviders, out HashSet <Type> requiredActivityExtensionTypes)) { // a) filter out the extension Types that were already configured by the host. Note that only "primary" extensions are in play here, not // "additional" extensions HashSet <Type> allExtensionTypes = new HashSet <Type>(); if (extensionManager != null) { extensionManager.AddAllExtensionTypes(allExtensionTypes); } if (activityExtensionProviders != null) { filteredActivityExtensionProviders = new Dictionary <Type, WorkflowInstanceExtensionProvider>(activityExtensionProviders.Count); foreach (KeyValuePair <Type, WorkflowInstanceExtensionProvider> keyedActivityExtensionProvider in activityExtensionProviders) { Type newExtensionProviderType = keyedActivityExtensionProvider.Key; if (!TypeHelper.ContainsCompatibleType(allExtensionTypes, newExtensionProviderType)) { // first see if the new provider supersedes any existing ones List <Type> typesToRemove = null; bool skipNewExtensionProvider = false; foreach (Type existingExtensionProviderType in filteredActivityExtensionProviders.Keys) { // Use AreReferenceTypesCompatible for performance since we know that all of these must be reference types if (TypeHelper.AreReferenceTypesCompatible(existingExtensionProviderType, newExtensionProviderType)) { skipNewExtensionProvider = true; break; } if (TypeHelper.AreReferenceTypesCompatible(newExtensionProviderType, existingExtensionProviderType)) { if (typesToRemove == null) { typesToRemove = new List <Type>(); } typesToRemove.Add(existingExtensionProviderType); } } // prune unnecessary extension providers (either superseded by the new extension or by an existing extension that supersedes them both) if (typesToRemove != null) { for (int i = 0; i < typesToRemove.Count; i++) { filteredActivityExtensionProviders.Remove(typesToRemove[i]); } } // and add a new extension if necessary if (!skipNewExtensionProvider) { filteredActivityExtensionProviders.Add(newExtensionProviderType, keyedActivityExtensionProvider.Value); } } } if (filteredActivityExtensionProviders.Count > 0) { allExtensionTypes.UnionWith(filteredActivityExtensionProviders.Keys); extensionProviderCount += filteredActivityExtensionProviders.Count; } } // b) Validate that all required extensions will be provided if (requiredActivityExtensionTypes != null && requiredActivityExtensionTypes.Count > 0) { foreach (Type requiredType in requiredActivityExtensionTypes) { if (!TypeHelper.ContainsCompatibleType(allExtensionTypes, requiredType)) { throw FxTrace.Exception.AsError(new ValidationException(SR.RequiredExtensionTypeNotFound(requiredType.ToString()))); } } } } // Finally, if our checks of passed, resolve our delegates if (extensionProviderCount > 0) { this.instanceExtensions = new List <KeyValuePair <WorkflowInstanceExtensionProvider, object> >(extensionProviderCount); if (extensionManager != null) { List <KeyValuePair <Type, WorkflowInstanceExtensionProvider> > extensionProviders = extensionManager.ExtensionProviders; for (int i = 0; i < extensionProviders.Count; i++) { KeyValuePair <Type, WorkflowInstanceExtensionProvider> extensionProvider = extensionProviders[i]; AddInstanceExtension(extensionProvider.Value); } } if (filteredActivityExtensionProviders != null) { foreach (WorkflowInstanceExtensionProvider extensionProvider in filteredActivityExtensionProviders.Values) { AddInstanceExtension(extensionProvider); } } } }