Лично я думаю, что все, что нужно каждому разработчику, — это управлять многими if, else if, else или case и, наконец, запускать какой-то код. Кажется, вам нужен механизм правил.

В этой статье я хочу представить свою новую библиотеку, которая помогает добавить некоторые правила и вызвать действия, если все условия оцениваются и возвращают истинный результат.
Мне нужна функциональность для простого принятия решений, поэтому я решил поработать над библиотека для этого. RuleEngineCore — это библиотека, разработанная на C#, которая также может работать на .net core.
В этой библиотеке вы можете определить свои факты как входные значения для правила. Правила используют это значение в условиях, которые я опишу ниже, и запускают действие вашего правила в соответствии с приоритетом, который вы установили, и запускают следующее правило, если вы определили его ранее.

По этой причине вам необходимо реализовать свое правило для каждого протокола именования, которое вы хотите. Потому что вам просто нужно использовать наши аннотации или атрибуты.
У нас есть 3 типа атрибутов:

1. Правило

2. Условие

3. Действие

Атрибут правила используется только в классе и принимает 3 свойства, такие как имя, описание и тип другого класса, в качестве следующего правила.
Примечание: NextRule должен использовать атрибут правила, в противном случае мы также не запускаем условия и действия.
Пример правила здесь:

[Rule(NextRule = typeof(AccountRule))]
public class IdentificationRule
{
    // Class Body
}
[Rule]
public class AccountRule
{
    // Class Body
}

Атрибут условия используется только для методов, и у вас может быть более одного условия. Этот атрибут принимает два свойства для именования входных аргументов и сообщения об ошибке, чтобы вызвать ошибку исключения, когда результат условия неверен.
Метод условия должен возвращать логическое значение и иметь по крайней мере один аргумент.
Входные аргументы могут быть разделены. с `,`, и вы должны иметь одинаковый порядок входных аргументов в методах с каждым именем, которое вы хотите иметь.
Пример условия здесь:

[Condition("Birthdate,Gender", "If you are boy Your age must be more than 18 years old else more than 20 years old.")]
public bool CheckAgeByGender(DateTime BirthDate, bool Gender)
{
      return Gender ? CalcualteAge(BirthDate) > 18 :     CalcualteAge(BirthDate) > 20;
}
private int CalcualteAge(DateTime BirthDate)
    {
        var today = DateTime.Today;
        var age = today.Year - BirthDate.Year;
        if (BirthDate.Date > today.AddYears(-age)) age--;
        return age;
    }
[Condition("NationalId", "Your NationalId is not valid.")]
public bool NationalIdIsValid(string NationalId)
{
    return NationalId.Length == 10;
}

Атрибут действия — это последний атрибут, который вы можете использовать в классе правил. Этот атрибут принимает только одно свойство, называемое порядком, значение которого по умолчанию равно 1, и демонстрирует приоритет выполняемых действий.
Метод действия ничего не возвращает и также не принимает никаких аргументов.
Пример атрибута действия находится в здесь :

[Action]
public void UpdateUserInfo()
{
    // Call a service or business to update something or do anything that you must to do
    Console.WriteLine("AccountRule Is passed too.");
}

И, наконец, чтобы вы разработали все правила, которые вам нужны, вы должны создать новый экземпляр класса Факты и поместить все данные, которые вы использовали в условиях. Каждое значение, которое вы запрашиваете из фактов и не ставите перед этим, должно вызывать ошибку.
Пример факта:

var facts = new Facts();
facts.Put("Birthdate", new DateTime(1988, 11, 23));
facts.Put("Gender", true);
facts.Put("NationalId", "1234567890");

Теперь все идет хорошо, чтобы запустить первое правило с определением класса правила и передать факты, когда вы хотите выполнить правило.
Пример правила:

try
{
    Rule MyRule = new Rule(new IdentificationRule());
    MyRule.Execute(facts);
}
catch (RuleException ruleException)
{
    Console.WriteLine(ruleException.Message);
    var inner = ruleException.InnerException;
    while (inner != null)
    {
        Console.WriteLine(inner.Message);
        inner = inner.InnerException;
    }
}

TL;DR,

RuleEngineCore — это действительно простой генератор правил, в котором вы можете определять свои факты и разрабатывать основные функции правил, которые вы можете выбрать для имени метода.
Вам просто нужно использовать нашу аннотацию, чтобы продемонстрировать действия и условия. Эта библиотека разработана на C# и может также работать на ядре .net.

Эта библиотека с открытым исходным кодом, и вы можете найти исходный код в репозитории Github, также у нас есть Github Wiki, который может быть полезен. Вы можете получить последнюю версию библиотеки из Github release или Nuget. Исходный код полного примера находится на странице Github Wiki, которую вы можете найти по этой ссылке.

Я буду рад получить ваше мнение, чтобы завершить эту библиотеку и сделать мир интересным для всех разработчиков.