public interface IRule
{
bool Check(string input);
}
У меня есть интерфейс, который определяет правило. Правило - это просто общее бизнес-правило или ограничение, которое может создать пользователь. Итак, у меня есть два примера правил:
public class ContainsRule : IRule
{
public string MustContain { get; set; }
public bool Check(string input)
{
return input.Contains(this.MustContain);
}
}
public class LengthRule : IRule
{
public int MaxLength { get; set; }
public bool Check(string input)
{
return input.Length <= this.MaxLength;
}
}
Правила могут иметь более одного свойства, которое можно установить, но в этом примере каждое из этих правил имеет только одно свойство.
Пользователь может создать свой собственный набор правил, которые должны быть сохранены. Например, у пользователя есть эти три правила:
IRule[] rules = new IRule[]
{
new ContainsRule { MustContain = "foo" },
new ContainsRule { MustContain = "bar" },
new LengthRule { MaxLength = 5}
};
Мне нужно сохранить эту информацию в базе данных или в каком-либо хранилище данных для каждого пользователя. Поскольку у каждого пользователя может быть свой набор правил, я не уверен, как должны выглядеть таблицы базы данных.
User | ClassName | Parameters
-----------------------------------------------
1 | Namespace.ContainsRule | MustContain:foo
1 | Namespace.ContainsRule | MustContain:bar
1 | Namespace.LengthRule | MaxLength:5
Моим первоначальным предположением было бы создать таблицу, которая будет выглядеть примерно так, как указано выше, где параметры должны содержать строку. Это означает, что мне нужно будет проанализировать информацию и использовать отражение или что-то еще, чтобы установить свойства. Мне нужно будет использовать активатор для создания класса, используя столбец ClassName. Другое предложение заключалось в том, чтобы вместо создания строки с разделителями для всех свойств была бы другая таблица. Каждое из свойств будет отдельной строкой, которая имеет отношение внешнего ключа к строке в таблице выше.
Однако оба примера не являются лучшим способом сохранения этих правил. Есть лучший способ сделать это?