public static RuleEngineExecutor <AssessmentInstance> CreateRuleEngineExecutor(AssessmentInstance assessmentInstance)
        {
            var ruleCollection     = (IRuleCollection <AssessmentInstance>)IoC.CurrentContainer.TryResolve(typeof(IAssessmentRuleCollection), assessmentInstance.AssessmentName) ?? new EmptyRuleCollection <AssessmentInstance> ();
            var ruleEngineExecutor = new RuleEngineExecutor <AssessmentInstance> (assessmentInstance, ruleCollection);

            return(ruleEngineExecutor);
        }
예제 #2
0
 /// <summary>Adds rule set and context object for this rule engine execution.</summary>
 /// <param name="ruleEngineExecutor">The rule engine executor.</param>
 /// <param name="itemInstance">The item instance.</param>
 /// <param name="callingMethod">The calling method.</param>
 /// <returns>A <see cref="RuleEngineExecutor{AssessmentInstance}" />.</returns>
 public static RuleEngineExecutor <AssessmentInstance> ForItemInstance(
     this RuleEngineExecutor <AssessmentInstance> ruleEngineExecutor,
     ItemInstance itemInstance,
     [CallerMemberName] string callingMethod = "")
 {
     Check.IsNotNull(itemInstance, "itemInstance is required");
     return(ruleEngineExecutor
            .ForRuleSet(callingMethod + "RuleSet" + itemInstance.ItemDefinitionCode)
            .WithContext(itemInstance, itemInstance.ItemDefinitionCode));
 }
예제 #3
0
        /// <summary>Creates the rule engine executor.</summary>
        /// <param name="assessmentInstance">The assessment instance.</param>
        /// <returns>A <see cref="RuleEngineExecutor{AssessmentInstance}"/>.</returns>
        public static RuleEngineExecutor <AssessmentInstance> CreateRuleEngineExecutor(AssessmentInstance assessmentInstance)
        {
            Check.IsNotNull(assessmentInstance, "assessmentInstance is required.");
            var assessmentRuleCollectionFactory = new AssessmentRuleCollectionFactory();
            var ruleEngineExecutor = new RuleEngineExecutor <AssessmentInstance> (
                assessmentInstance,
                assessmentRuleCollectionFactory.CreateRuleCollection(assessmentInstance.AssessmentName));

            return(ruleEngineExecutor);
        }
예제 #4
0
        private void Apply(ItemUpdatedEvent itemUpdatedEvent)
        {
            var itemInstance = ItemInstances.FirstOrDefault(ii => ii.ItemDefinitionCode == itemUpdatedEvent.ItemDefinitionCode);
            var isNull       = itemUpdatedEvent.Value == null || string.IsNullOrEmpty(itemUpdatedEvent.Value.ToString());

            if (itemInstance != null && isNull)
            {
                _itemInstances.Remove(itemInstance);
            }

            if (itemInstance == null)
            {
                itemInstance = new ItemInstance(itemUpdatedEvent.ItemDefinitionCode, itemUpdatedEvent.Value, itemUpdatedEvent.IsRequired);
                if (!isNull)
                {
                    _itemInstances.Add(itemInstance);
                }
            }
            else
            {
                itemInstance.Apply(itemUpdatedEvent);
            }

            var skippingContext = new SkippingContext();

            if (_cachedRuleEngineExecutor == null)
            {
                var assessmentRuleCollectionFactory = new AssessmentRuleCollectionFactory();
                _cachedRuleEngineExecutor = new RuleEngineExecutor <AssessmentInstance> (
                    this,
                    assessmentRuleCollectionFactory.CreateRuleCollection(this.AssessmentName));
            }
            _cachedRuleEngineExecutor
            .ForRuleSet("ItemUpdatedRuleSet" + itemInstance.ItemDefinitionCode)
            .WithContext(itemInstance, itemInstance.ItemDefinitionCode)
            .WithContext(skippingContext)
            .Execute();

            skippingContext.SkippedItemDefinitions.ForEach(
                item =>
            {
                if (item.GetIsRequired() && !_skippedItemDefinitions.Contains(item))
                {
                    _skippedItemDefinitions.Add(item);
                }
                if (ItemInstances.Any(i => i.ItemDefinitionCode == item.CodedConcept.Code))
                {
                    UpdateItem(item, null);
                }
            });
            skippingContext.UnSkippedItemDefinitions.ForEach(item => _skippedItemDefinitions.Remove(item));
        }
 public static RuleEngineExecutor <AssessmentInstance> ForItemDefinitionCode(this RuleEngineExecutor <AssessmentInstance> ruleEngineExecutor, string itemDefinitionCode)
 {
     return(ruleEngineExecutor.ForRuleSet("RuleSet" + itemDefinitionCode));
 }
예제 #6
0
 /// <summary>
 ///     Fors the calling method rule set.
 /// </summary>
 /// <typeparam name="T">Type of rule engine subject.</typeparam>
 /// <param name="ruleEngineExecutor">The rule engine executor.</param>
 /// <param name="caller">The caller.</param>
 /// <returns>
 ///     A rule engine executor.
 /// </returns>
 public static RuleEngineExecutor <T> ForCallingMethodRuleSet <T> (
     this RuleEngineExecutor <T> ruleEngineExecutor,
     [CallerMemberName] string caller = null)
 {
     return(ruleEngineExecutor.ForRuleSet(caller + "RuleSet"));
 }