Beispiel #1
0
        /// <summary>
        /// To delete the rule and all opposite rules. If the rule is executed at the time when this method is called, it will not be deleted.
        /// </summary>
        /// <param name="container">The rules container.</param>
        /// <param name="rule">Rule.</param>
        /// <returns><see langword="true" />, if rule was removed, otherwise, <see langword="false" />.</returns>
        public static bool TryRemoveWithExclusive(this IMarketRuleContainer container, IMarketRule rule)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }

            if (rule == null)
            {
                throw new ArgumentNullException(nameof(rule));
            }

            if (container.TryRemoveRule(rule))
            {
                if (rule.ExclusiveRules.Count > 0)
                {
                    foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear()))
                    {
                        container.TryRemoveRule(exclusiveRule, false);
                    }
                }

                return(true);
            }

            return(false);
        }
Beispiel #2
0
        /// <summary>
        /// To activate the rule.
        /// </summary>
        /// <param name="container">The rules container.</param>
        /// <param name="rule">Rule.</param>
        /// <param name="process">The handler.</param>
        public static void ActiveRule(this IMarketRuleContainer container, IMarketRule rule, Func <bool> process)
        {
            if (process == null)
            {
                throw new ArgumentNullException(nameof(process));
            }

            container.AddRuleLog(LogLevels.Debug, rule, LocalizedStrings.Str1082);

            List <IMarketRule> removedRules = null;

            // mika
            // проверяем правило, так как оно могло быть удалено параллельным потоком
            if (!rule.IsReady)
            {
                return;
            }

            rule.IsActive = true;

            try
            {
                if (process())
                {
                    container.Rules.Remove(rule);
                    removedRules = new List <IMarketRule> {
                        rule
                    };
                }
            }
            finally
            {
                rule.IsActive = false;
            }

            if (removedRules == null)
            {
                return;
            }

            if (rule.ExclusiveRules.Count > 0)
            {
                foreach (var exclusiveRule in rule.ExclusiveRules.SyncGet(c => c.CopyAndClear()))
                {
                    container.TryRemoveRule(exclusiveRule, false);
                    removedRules.Add(exclusiveRule);
                }
            }

            foreach (var removedRule in removedRules)
            {
                container.AddRuleLog(LogLevels.Debug, removedRule, LocalizedStrings.Str1083);
            }
        }