# Class AggregatingRuleProvider OptimaJet.Workflow.Core.Runtime.AggregatingRuleProvider Combines registered [IWorkflowRuleProvider](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) implementations into one provider and resolves duplicate rule names by registration priority. Namespace: [OptimaJet.Workflow.Core.Runtime](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/) ```csharp public class AggregatingRuleProvider : BaseAggregatingProvider, IWorkflowRuleProvider ``` ## Type Hierarchy - [BaseAggregatingProvider](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/BaseAggregatingProvider-T/) - AggregatingRuleProvider Current type - Implemented interfaces - [IWorkflowRuleProvider](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) ## Methods `public List GetRules(string schemeCode, NamesSearchType namesSearchType)` Gets the rule names implemented by this provider for a process scheme. ### Parameters | Name | Type | Description | | --- | --- | --- | | `schemeCode` | `String` | The effective process scheme code used to resolve scheme-specific rules, or [null](https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/null) when the caller has no process scheme context. | | `namesSearchType` | `NamesSearchType` | The filtering mode. [NamesSearchType.All](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/NamesSearchType/) includes rules excluded by provider-specific exclusion settings and is used for runtime rule resolution. [NamesSearchType.NotExcluded](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/NamesSearchType/) omits those rules, for example when the Designer builds its list of available rules. | ### Returns | Type | Description | | --- | --- | | `List` | A non-null list of rule names implemented by this provider for the requested scheme and filtering mode. | ### Remarks Providers are queried from earliest to latest registration, and `namesSearchType` is passed through unchanged. When a name occurs more than once, its first occurrence is retained. `public bool Check(ProcessInstance processInstance, WorkflowRuntime runtime, string identityId, string ruleName, string parameter)` Determines whether a workflow participant identity satisfies a rule. ### Parameters | Name | Type | Description | | --- | --- | --- | | `processInstance` | `ProcessInstance` | The process instance whose state and parameters provide the evaluation context. | | `runtime` | `WorkflowRuntime` | The workflow runtime executing the evaluation. | | `identityId` | `String` | The application-defined value identifying the workflow participant to evaluate, such as a login, user name, database identifier, or another identifier understood by the provider. | | `ruleName` | `String` | The name of a rule advertised by [IWorkflowRuleProvider.GetRules(string, NamesSearchType)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | | `parameter` | `String` | The provider-defined rule parameter. During standard restriction evaluation, this is the value from [ActorDefinition.Value](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Model/ActorDefinition/) after workflow substitutions have been applied. | ### Returns | Type | Description | | --- | --- | | `Boolean` | [true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) if `identityId` belongs to the set defined by the rule; otherwise, [false](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool). | ### Exceptions | Type | Description | | --- | --- | | `NotImplementedException` | Thrown when no applicable provider advertises the rule or when the owning provider reports rule checking as asynchronous. | ### Remarks The runtime calls this method when [IWorkflowRuleProvider.IsCheckAsync(string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) returns [false](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) for the same rule and scheme. `public virtual Task CheckAsync(ProcessInstance processInstance, WorkflowRuntime runtime, string identityId, string ruleName, string parameter, CancellationToken token)` Asynchronously determines whether a workflow participant identity satisfies a rule. ### Parameters | Name | Type | Description | | --- | --- | --- | | `processInstance` | `ProcessInstance` | The process instance whose state and parameters provide the evaluation context. | | `runtime` | `WorkflowRuntime` | The workflow runtime executing the evaluation. | | `identityId` | `String` | The application-defined value identifying the workflow participant to evaluate, such as a login, user name, database identifier, or another identifier understood by the provider. | | `ruleName` | `String` | The name of a rule advertised by [IWorkflowRuleProvider.GetRules(string, NamesSearchType)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | | `parameter` | `String` | The provider-defined rule parameter. During standard restriction evaluation, this is the value from [ActorDefinition.Value](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Model/ActorDefinition/) after workflow substitutions have been applied. | | `token` | `CancellationToken` | The token supplied by the current workflow operation to observe cancellation. | ### Returns | Type | Description | | --- | --- | | `Task` | A task whose result is [true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) if `identityId` belongs to the set defined by the rule; otherwise, [false](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool). | ### Exceptions | Type | Description | | --- | --- | | `NotImplementedException` | Thrown when no applicable provider advertises the rule or when the owning provider reports rule checking as synchronous. | ### Remarks The runtime calls this method when [IWorkflowRuleProvider.IsCheckAsync(string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) returns [true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) for the same rule and scheme. `public IEnumerable GetIdentities(ProcessInstance processInstance, WorkflowRuntime runtime, string ruleName, string parameter)` Gets all workflow participant identities that satisfy a rule. ### Parameters | Name | Type | Description | | --- | --- | --- | | `processInstance` | `ProcessInstance` | The process instance whose state and parameters provide the lookup context. | | `runtime` | `WorkflowRuntime` | The workflow runtime executing the lookup. | | `ruleName` | `String` | The name of a rule advertised by [IWorkflowRuleProvider.GetRules(string, NamesSearchType)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | | `parameter` | `String` | The provider-defined rule parameter. During standard actor calculation, this is the value from [ActorDefinition.Value](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Model/ActorDefinition/) after workflow substitutions have been applied. | ### Returns | Type | Description | | --- | --- | | `IEnumerable` | A non-null sequence of application-defined workflow participant identities. Each value must use the same identity representation accepted by [IWorkflowRuleProvider.Check(ProcessInstance, WorkflowRuntime, string, string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | ### Exceptions | Type | Description | | --- | --- | | `NotImplementedException` | Thrown when no applicable provider advertises the rule or when the owning provider reports workflow participant identity lookup as asynchronous. | ### Remarks The runtime calls this method when [IWorkflowRuleProvider.IsGetIdentitiesAsync(string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) returns [false](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) for the same rule and scheme. `public virtual Task> GetIdentitiesAsync(ProcessInstance processInstance, WorkflowRuntime runtime, string ruleName, string parameter, CancellationToken token)` Asynchronously gets all workflow participant identities that satisfy a rule. ### Parameters | Name | Type | Description | | --- | --- | --- | | `processInstance` | `ProcessInstance` | The process instance whose state and parameters provide the lookup context. | | `runtime` | `WorkflowRuntime` | The workflow runtime executing the lookup. | | `ruleName` | `String` | The name of a rule advertised by [IWorkflowRuleProvider.GetRules(string, NamesSearchType)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | | `parameter` | `String` | The provider-defined rule parameter. During standard actor calculation, this is the value from [ActorDefinition.Value](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Model/ActorDefinition/) after workflow substitutions have been applied. | | `token` | `CancellationToken` | The token supplied by the current workflow operation to observe cancellation. | ### Returns | Type | Description | | --- | --- | | `Task` | A task whose result is a non-null sequence of application-defined workflow participant identities. Each value must use the same identity representation accepted by [IWorkflowRuleProvider.Check(ProcessInstance, WorkflowRuntime, string, string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | ### Exceptions | Type | Description | | --- | --- | | `NotImplementedException` | Thrown when no applicable provider advertises the rule or when the owning provider reports workflow participant identity lookup as synchronous. | ### Remarks The runtime calls this method when [IWorkflowRuleProvider.IsGetIdentitiesAsync(string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) returns [true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) for the same rule and scheme. `public bool IsCheckAsync(string ruleName, string schemeCode)` Indicates whether the runtime should call [IWorkflowRuleProvider.CheckAsync(ProcessInstance, WorkflowRuntime, string, string, string, CancellationToken)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) instead of [IWorkflowRuleProvider.Check(ProcessInstance, WorkflowRuntime, string, string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) for a rule. ### Parameters | Name | Type | Description | | --- | --- | --- | | `ruleName` | `String` | The name of a rule advertised by [IWorkflowRuleProvider.GetRules(string, NamesSearchType)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | | `schemeCode` | `String` | The effective process scheme code used to resolve the rule. | ### Returns | Type | Description | | --- | --- | | `Boolean` | [true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) to use [IWorkflowRuleProvider.CheckAsync(ProcessInstance, WorkflowRuntime, string, string, string, CancellationToken)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/); [false](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) to use [IWorkflowRuleProvider.Check(ProcessInstance, WorkflowRuntime, string, string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | ### Exceptions | Type | Description | | --- | --- | | `NotImplementedException` | Thrown when the rule is not implemented for the given scheme. | ### Remarks This choice is independent of the identity lookup mode returned by [IWorkflowRuleProvider.IsGetIdentitiesAsync(string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). `public bool IsGetIdentitiesAsync(string ruleName, string schemeCode)` Indicates whether the runtime should call [IWorkflowRuleProvider.GetIdentitiesAsync(ProcessInstance, WorkflowRuntime, string, string, CancellationToken)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) instead of [IWorkflowRuleProvider.GetIdentities(ProcessInstance, WorkflowRuntime, string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/) for a rule. ### Parameters | Name | Type | Description | | --- | --- | --- | | `ruleName` | `String` | The name of a rule advertised by [IWorkflowRuleProvider.GetRules(string, NamesSearchType)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | | `schemeCode` | `String` | The effective process scheme code used to resolve the rule. | ### Returns | Type | Description | | --- | --- | | `Boolean` | [true](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) to use [IWorkflowRuleProvider.GetIdentitiesAsync(ProcessInstance, WorkflowRuntime, string, string, CancellationToken)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/); [false](https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/bool) to use [IWorkflowRuleProvider.GetIdentities(ProcessInstance, WorkflowRuntime, string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). | ### Exceptions | Type | Description | | --- | --- | | `NotImplementedException` | Thrown when the rule is not implemented for the given scheme. | ### Remarks This choice is independent of the rule-checking mode returned by [IWorkflowRuleProvider.IsCheckAsync(string, string)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/IWorkflowRuleProvider/). ## Remarks For a scheme, both global providers and providers registered specifically for that scheme are applicable. Providers are searched from the most recently registered to the earliest, regardless of registration scope. The first provider that advertises a rule name owns that name. The owning provider independently determines whether rule checking and workflow participant identity lookup are synchronous or asynchronous. Calling the opposite method throws [NotImplementedException](https://learn.microsoft.com/dotnet/api/system.notimplementedexception); the aggregator does not fall back to an older provider that advertises the same rule in the requested execution mode. [AggregatingRuleProvider.GetRules(string, NamesSearchType)](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/AggregatingRuleProvider/) is a catalog operation rather than a dispatch operation. It combines names from every applicable provider in earliest-to-latest registration order and removes duplicates, so its result order does not represent dispatch priority. [Previous AggregatingExternalParametersProvider](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/AggregatingExternalParametersProvider/) [Next BaseAggregatingProvider](https://api.workflowengine.io/core/OptimaJet.Workflow.Core.Runtime/BaseAggregatingProvider-T/)