Esempio n. 1
0
        /// <summary>
        /// Loads a context by a given identifier based on a passed in repository
        /// </summary>
        /// <param name="identifier">Identifier representing a context</param>
        /// <param name="ruleExecuter">Passed in empty rule executer</param>
        /// <param name="ruleRepository">Repository for saved rules</param>
        /// <param name="ruleTemplateFactory">Factory for service specific templates</param>
        /// <returns></returns>
        public static async Task <RuleContext <TFact, TOutput> > LoadContext(
            Guid identifier,
            IRuleExecuter <TFact, TOutput> ruleExecuter,
            IRuleRepository ruleRepository,
            IRuleTemplateFactory <TFact, TOutput> ruleTemplateFactory)
        {
            var rules = await ruleRepository.GetRulesByContext(identifier);

            var context = new RuleContext <TFact, TOutput>(ruleExecuter, ruleRepository, identifier, ruleTemplateFactory);

            foreach (var ruleData in rules)
            {
                var condition = ruleTemplateFactory
                                .CreateCondition(ruleData.ConditionType, ruleData.ConditionData);
                var consequence = ruleTemplateFactory
                                  .CreateConsequence(ruleData.ConsequenceType, ruleData.ConsequenceData);

                var template = new RuleTemplate <TFact, TOutput>(condition, consequence);

                ruleExecuter.AddRule(ruleData.Id, template.Rule);
            }

            return(context);
        }