IIdentifierCreationService Interface
.NET Framework 3.0
Provides a mechanism to create uniquely named identifiers throughout a specified range of activities.
Namespace: System.Workflow.ComponentModel.Design
Assembly: System.Workflow.ComponentModel (in system.workflow.componentmodel.dll)
Assembly: System.Workflow.ComponentModel (in system.workflow.componentmodel.dll)
The following example shows an implementation of the IIdentifierCreationService. This service ensures that each of the identifiers used within the current workflow are all unique.
internal sealed class IdentifierCreationService : IIdentifierCreationService { private IServiceProvider serviceProvider = null; internal IdentifierCreationService(IServiceProvider serviceProvider) { this.serviceProvider = serviceProvider; } void IIdentifierCreationService.ValidateIdentifier(Activity activity, string identifier) { if (identifier == null) throw new ArgumentNullException("identifier"); if (activity == null) throw new ArgumentNullException("activity"); if (activity.Name.ToLower().Equals(identifier.ToLower())) return; ArrayList identifiers = new ArrayList(); Activity rootActivity = GetRootActivity(activity); identifiers.AddRange(GetIdentifiersInCompositeActivity(rootActivity as CompositeActivity)); identifiers.Sort(); if (identifiers.BinarySearch(identifier.ToLower(), StringComparer.OrdinalIgnoreCase) >= 0) throw new ArgumentException(string.Format("Duplicate Component Identifier {0}", identifier)); } void IIdentifierCreationService.EnsureUniqueIdentifiers(CompositeActivity parentActivity, ICollection childActivities) { if (parentActivity == null) throw new ArgumentNullException("parentActivity"); if (childActivities == null) throw new ArgumentNullException("childActivities"); List<Activity> allActivities = new List<Activity>(); Queue activities = new Queue(childActivities); while (activities.Count > 0) { Activity activity = (Activity)activities.Dequeue(); if (activity is CompositeActivity) { foreach (Activity child in ((CompositeActivity)activity).Activities) activities.Enqueue(child); } //If we are moving activities, we need not regenerate their identifiers if (((IComponent)activity).Site != null) continue; allActivities.Add(activity); } // get the root activity CompositeActivity rootActivity = GetRootActivity(parentActivity) as CompositeActivity; ArrayList identifiers = new ArrayList(); // all the identifiers in the workflow identifiers.AddRange(GetIdentifiersInCompositeActivity(rootActivity)); foreach (Activity activity in allActivities) { string finalIdentifier = activity.Name; // now loop until we find a identifier that hasn't been used. string baseIdentifier = GetBaseIdentifier(activity); int index = 0; identifiers.Sort(); while (finalIdentifier == null || finalIdentifier.Length == 0 || identifiers.BinarySearch(finalIdentifier.ToLower(), StringComparer.OrdinalIgnoreCase) >= 0) { finalIdentifier = string.Format("{0}{1}", baseIdentifier, ++index); } // add new identifier to collection identifiers.Add(finalIdentifier); activity.Name = finalIdentifier; } } private static IList GetIdentifiersInCompositeActivity(CompositeActivity compositeActivity) { ArrayList identifiers = new ArrayList(); if (compositeActivity != null) { identifiers.Add(compositeActivity.Name); IList<Activity> allChildren = GetAllNestedActivities(compositeActivity); foreach (Activity activity in allChildren) identifiers.Add(activity.Name); } return ArrayList.ReadOnly(identifiers); } private static string GetBaseIdentifier(Activity activity) { string baseIdentifier = activity.GetType().Name; StringBuilder b = new StringBuilder(baseIdentifier.Length); for (int i = 0; i < baseIdentifier.Length; i++) { if (Char.IsUpper(baseIdentifier[i]) && (i == 0 || i == baseIdentifier.Length - 1 || Char.IsUpper(baseIdentifier[i + 1]))) { b.Append(Char.ToLower(baseIdentifier[i])); } else { b.Append(baseIdentifier.Substring(i)); break; } } return b.ToString(); } private static Activity GetRootActivity(Activity activity) { if (activity == null) throw new ArgumentException("activity"); while (activity.Parent != null) activity = activity.Parent; return activity; } private static Activity[] GetAllNestedActivities(CompositeActivity compositeActivity) { if (compositeActivity == null) throw new ArgumentNullException("compositeActivity"); ArrayList nestedActivities = new ArrayList(); Queue compositeActivities = new Queue(); compositeActivities.Enqueue(compositeActivity); while (compositeActivities.Count > 0) { CompositeActivity compositeActivity2 = (CompositeActivity)compositeActivities.Dequeue(); foreach (Activity activity in compositeActivity2.Activities) { nestedActivities.Add(activity); if (activity is CompositeActivity) compositeActivities.Enqueue(activity); } foreach (Activity activity in compositeActivity2.EnabledActivities) { if (!nestedActivities.Contains(activity)) { nestedActivities.Add(activity); if (activity is CompositeActivity) compositeActivities.Enqueue(activity); } } } return (Activity[])nestedActivities.ToArray(typeof(Activity)); } }
Windows 98, Windows Server 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.Community Additions
ADD
Show: