public async Task ApplyRuleChanges(RuleDescription[] newRules, RuleDescription[] existingRules, string[] messagesTypes) { var newRulesAlreadyPresent = new List <Rule>(); foreach (var newRuleDescription in newRules) { var existingRulesWithSameName = new List <Rule>(); foreach (var ruleDescription in existingRules) { var oldRule = GetRuleVersion(ruleDescription); var newRule = GetRuleVersion(newRuleDescription); if (oldRule.RuleDescription.Name == newRule.RuleDescription.Name) { existingRulesWithSameName.Add(oldRule); break; } if (oldRule.Name == newRule.Name && oldRule.Version >= newRule.Version) { existingRulesWithSameName.Add(oldRule); break; } } if (!existingRulesWithSameName.Any()) { continue; } newRulesAlreadyPresent.Add(GetRuleVersion(newRuleDescription)); if (((SqlFilter)existingRulesWithSameName.First().RuleDescription.Filter).SqlExpression != ((SqlFilter)newRuleDescription.Filter).SqlExpression) { throw new InvalidOperationException("Message types inside the assembly have changed, but the assembly version number has not."); } } if (newRulesAlreadyPresent.Count < newRules.Length) { foreach (var newRule in GetNewRulesNotAlreadyPresent(newRules, newRulesAlreadyPresent.Select(x => x.RuleDescription.Name))) { await _ruleApplier.AddRule(newRule).ConfigureAwait(false); } } foreach (var existingRule in GetOutdatedExistingRules(existingRules, newRules)) { await _ruleApplier.RemoveRule(existingRule).ConfigureAwait(false); } }