Сохранение бизнес-правил для пользователя - PullRequest
2 голосов
/ 04 мая 2011
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. Другое предложение заключалось в том, чтобы вместо создания строки с разделителями для всех свойств была бы другая таблица. Каждое из свойств будет отдельной строкой, которая имеет отношение внешнего ключа к строке в таблице выше.

Однако оба примера не являются лучшим способом сохранения этих правил. Есть лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 04 мая 2011

Почему бы не использовать сериализацию XML. Таблица базы данных будет содержать User # и сериализацию XML индивидуального правила.

0 голосов
/ 04 мая 2011

Мне кажется, проще говоря, вам нужно сопоставить ваши объекты с таблицами SQL (если бы существовала технология, которая могла бы делать это автоматически ...:)

На основании того, что вы опубликовалиЯ предполагаю, по крайней мере, шесть таблиц SQL, больше, если есть дополнительные подклассы правила, например

  • Правила
  • MustContainTextRules (подкласс правил, 1: 0..m)
  • MaxLengthRules (подкласс правил, 1: 0..1)
  • [Возможно, другие подклассы правил, например, MinLengthRules?]
  • Наборы правил («набор правил»)
  • Пользователи
  • RulesetOwnership (таблица отношений между пользователями и наборами правил)

На то, являются ли они отдельными таблицами, может влиять то, взаимосвязаны ли правила, например, если значение MinLengthRule дляRuleset не может превышать значение MaxLengthRule, тогда вам может быть сложно написать ограничение SQL для проверки этого, когда они находятся в разных таблицах.

0 голосов
/ 04 мая 2011

Я полагаю, что вы извлекаете данные из базы данных.
Если это так, попробуйте мое предложение.

Сохраните извлеченные данные в таблицу данных или преобразуйте их в базу данных перед применением правила.
Так чтоПравило может быть помещено как обычный sql в свойство фильтра datatable.Вместо имени и параметров правила вы можете изменить его на столбец, содержащий
column like '%foo%'

Затем примените это к фильтру таблицы данных.

PS: я преобразовал Список в Datatable ираньше использовал такой фильтр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...