Beispiel #1
0
        /// <summary>
        /// The main method for tules evaluation.
        /// </summary>
        public void Run()
        {
            DateTime now = DateTime.Now;

            if (loadRulesFromAssemblies.HasValue ? loadRulesFromAssemblies.Value : options.LoadRulesFromAssemblies)
            {
                if (String.IsNullOrEmpty(_rulesFolder))
                {
                    if (Path.IsPathRooted(options.RuleFolder))
                    {
                        _rulesFolder = options.RuleFolder;
                    }
                    else
                    {
                        _rulesFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, options.RuleFolder);
                    }
                }
                ProductionLoader.Instance.RulesDirectory = RulesFolder;
                ProductionLoader.Instance.RuleChanged   += Instance_RuleChanged;

                foreach (IProductionProvider ruleSetProvider in ProductionLoader.Instance.RuleSets)
                {
                    if (ruleSetProvider.EffectiveDate <= now && ruleSetProvider.TerminationDate > now)
                    {
                        foreach (Aggregator aggregator in ruleSetProvider.GetAggregators())
                        {
                            AddAggregator(aggregator);
                        }
                        foreach (Production production in ruleSetProvider.GetProductions())
                        {
                            AddProduction(production);
                        }
                        foreach (Override @override in ruleSetProvider.GetOverrides())
                        {
                            AddOverride(@override);
                        }
                        foreach (Mutex mutex in ruleSetProvider.GetMutexes())
                        {
                            AddMutex(mutex);
                        }
                    }
                }

                ProductionLoader.Instance.RuleChanged -= Instance_RuleChanged;
            }

            foreach (Production prod in _productions.Values)
            {
                _rete.AddProduction(prod);
            }
            foreach (Mutex mut in _mutexesNew)
            {
                _rete.AddMutex(mut);
            }
            foreach (Aggregator ag in _aggregators)
            {
                _rete.AddAggregator(ag);
            }
            foreach (WME wme in _initialFacts)
            {
                _rete.AddWME(wme);
            }
            EvaluateOverrides();
            EvaluateAggregators();
            ResolveConflicts();
            Activate();

            ResolveMutexes();
        }