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