//--------------------------------------------------------------------- // Public Cadence workflow related operations. /// <summary> /// Registers a workflow implementation with Cadence. /// </summary> /// <typeparam name="TWorkflow">The <see cref="IWorkflowBase"/> derived class implementing the workflow.</typeparam> /// <param name="workflowTypeName"> /// Optionally specifies a custom workflow type name that will be used /// for identifying the workflow implementation in Cadence. This defaults /// to the fully qualified <typeparamref name="TWorkflow"/> type name. /// </param> /// <param name="domain">Optionally overrides the default client domain.</param> /// <returns>The tracking <see cref="Task"/>.</returns> /// <exception cref="InvalidOperationException">Thrown if another workflow class has already been registered for <paramref name="workflowTypeName"/>.</exception> /// <exception cref="CadenceWorkflowWorkerStartedException"> /// Thrown if a workflow worker has already been started for the client. You must /// register activity workflow implementations before starting workers. /// </exception> /// <remarks> /// <note> /// Be sure to register all of your workflow implementations before starting a workflow worker. /// </note> /// </remarks> public async Task RegisterWorkflowAsync <TWorkflow>(string workflowTypeName = null, string domain = null) where TWorkflow : WorkflowBase { CadenceHelper.ValidateWorkflowImplementation(typeof(TWorkflow)); CadenceHelper.ValidateWorkflowTypeName(workflowTypeName); if (string.IsNullOrEmpty(workflowTypeName)) { workflowTypeName = workflowTypeName ?? typeof(TWorkflow).FullName; } if (workflowWorkerStarted) { throw new CadenceWorkflowWorkerStartedException(); } // We need to register a workflow type name for each workflow method, // appending the method type separator and method name for workflow // methods that specify names. if (!WorkflowBase.Register(this, typeof(TWorkflow), workflowTypeName)) { var reply = (WorkflowRegisterReply) await CallProxyAsync( new WorkflowRegisterRequest() { Name = workflowTypeName, Domain = ResolveDomain(domain) }); reply.ThrowOnError(); } }
//--------------------------------------------------------------------- // Public Cadence workflow related operations. /// <summary> /// Registers a workflow implementation with Cadence. /// </summary> /// <typeparam name="TWorkflow">The <see cref="WorkflowBase"/> derived class implementing the workflow.</typeparam> /// <param name="workflowTypeName"> /// Optionally specifies a custom workflow type name that will be used /// for identifying the workflow implementation in Cadence. This defaults /// to the fully qualified <typeparamref name="TWorkflow"/> type name. /// </param> /// <param name="domain">Optionally overrides the default client domain.</param> /// <returns>The tracking <see cref="Task"/>.</returns> /// <exception cref="InvalidOperationException">Thrown if another workflow class has already been registered for <paramref name="workflowTypeName"/>.</exception> /// <exception cref="WorkflowWorkerStartedException"> /// Thrown if a workflow worker has already been started for the client. You must /// register workflow implementations before starting workers. /// </exception> /// <remarks> /// <note> /// Be sure to register all of your workflow implementations before starting workers. /// </note> /// </remarks> public async Task RegisterWorkflowAsync <TWorkflow>(string workflowTypeName = null, string domain = null) where TWorkflow : WorkflowBase { await SyncContext.ClearAsync; CadenceHelper.ValidateWorkflowImplementation(typeof(TWorkflow)); CadenceHelper.ValidateWorkflowTypeName(workflowTypeName); EnsureNotDisposed(); if (workflowWorkerStarted) { throw new WorkflowWorkerStartedException(); } var workflowType = typeof(TWorkflow); if (string.IsNullOrEmpty(workflowTypeName)) { workflowTypeName = CadenceHelper.GetWorkflowTypeName(workflowType, workflowType.GetCustomAttribute <WorkflowAttribute>()); } await WorkflowBase.RegisterAsync(this, workflowType, workflowTypeName, ResolveDomain(domain)); lock (registeredWorkflowTypes) { registeredWorkflowTypes.Add(CadenceHelper.GetWorkflowInterface(typeof(TWorkflow))); } }
/// <summary> /// Constructor. /// </summary> /// <param name="name"> /// Optionally specifies the workflow type name to be used /// when registering the workflow implementation with Cadence. /// </param> public WorkflowAttribute(string name = null) { CadenceHelper.ValidateWorkflowTypeName(name); this.Name = name; }