//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Description { using System.Collections.Generic; using System.Workflow.ComponentModel; using System.Workflow.Runtime; class DescriptionCreator { WorkflowDefinitionContext workflowDefinitionContext; public DescriptionCreator(WorkflowDefinitionContext workflowDefinitionContext) { if (workflowDefinitionContext == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("workflowDefinitionContext"); } this.workflowDefinitionContext = workflowDefinitionContext; } public ServiceDescription BuildServiceDescription(out IDictionary implementedContracts, out IList reflectedContracts) { ServiceDescriptionContext context = new ServiceDescriptionContext(); ServiceDescription description = new ServiceDescription(); ApplyBehaviors(description); context.ServiceDescription = description; Walker walker = new Walker(true); walker.FoundActivity += delegate(Walker w, WalkerEventArgs args) { IServiceDescriptionBuilder activity = args.CurrentActivity as IServiceDescriptionBuilder; if (activity == null) { return; } activity.BuildServiceDescription(context); }; walker.Walk(this.workflowDefinitionContext.GetWorkflowDefinition()); if (context.Contracts == null || context.Contracts.Count == 0) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR2.GetString(SR2.NoContract))); } implementedContracts = context.Contracts; reflectedContracts = context.ReflectedContracts; return description; } void ApplyBehaviors(ServiceDescription serviceDescription) { WorkflowServiceBehavior wsb = new WorkflowServiceBehavior(workflowDefinitionContext); serviceDescription.Behaviors.Add(wsb); if (wsb.Name != null) { serviceDescription.Name = wsb.Name; } if (wsb.Namespace != null) { serviceDescription.Namespace = wsb.Namespace; } if (wsb.ConfigurationName != null) { serviceDescription.ConfigurationName = wsb.ConfigurationName; } } } }