2013-07-11 2 views
0

Я пытаюсь написать приложение C#, которое принимает сотни тысяч независимых строк данных и на основе определенных правил, определенных пользователем, устанавливает определенное свойство. Поэтому я думал об использовании механизма правил. После некоторого поиска в Google я решил использовать встроенный Windows Workflow Foundation Rules Engine.Может ли обработчик правил рабочего процесса Windows обрабатывать ветвление?

Интерфейс для создания правил представляется пользователю в трубы и фильтра стиле:

Исходные данные -> rule1 -> если результат к правилу 1 истинно, выполнить Правила2 /, если результат к правилу 1 является False, выполнить правило 3 -> ... ветви выполнения других правил ... -> в зависимости от принятых ветвей, свойство задано некоторым значением.

Я хочу иметь возможность выполнять правила в аналогичном канале и стиле фильтра/ветвления, а не последовательно, как это делает набор правил без цепочки. Я не уверен, как создать зависимости для набора правил цепочки в соответствии с моим потоком. Я понимаю, что WF имеет IfElse Activities специально для этого типа ветвления, которые поддерживают аналогичные правила, но Workflow Activities на два порядка медленнее.

Я использую эти технологии неправильно? (Я новичок в C#) Должен ли я задуматься о написании собственного механизма правил? Любые советы приветствуются.

Редактировать: Дополнительная информация о проведенных исследованиях. Я googled вокруг и читаю большинство сообщений в блогах/учебников/ресурсов msdn, которые я мог найти на прошлой неделе (без использования ссылок, есть тонны, и я использовал очевидные ключевые слова). Набор правил двигателя правил, по-видимому, используется исключительно для последовательных независимых правил, и когда они зависят, они сигнализируют об этом факте, изменяя некоторую переменную, которая является зависимостью в самом правиле, и заставляет эти правила переоценивать (что-то похожее на Я считаю, что RETE называется полной цепью). Я не вижу способ динамического вложения зависимостей в мои правила на основе их структуры и отношений. Однако я могу моделировать этот поток управления с помощью IfElse Activities.

Я реализовал небольшой набор правил с 700 строками данных образца и провел несколько тестов. (не использовать для вставки кода, у меня нет проблемы с этим). Они оценивают в ~ 50 мс, а эквивалентная логика, построенная с помощью операций IfElse и тех же правил, оценивается в aprox. 2 секунды, что я предполагаю, это из-за превышения активности переключения. Я либо не правильно использую эти технологии (я имею в виду, что я не знаю о том, что свойство наборов правил, которые нужно оценивать в гиперссылках в исключительных ветвях или более быстрых переключениях), или нет простого способа контролировать поток выполнения только с помощью поэтому я должен понести большой штраф за выполнение действий. В этом случае я мог бы написать свой собственный механизм правил.

Edit 2: A diagram of the flow of execution I need from the ruleset

+0

Покажите нам какое-то усилие, которое вы внесли в исследование, добавьте больше деталей, чтобы улучшить ваше изменение, чтобы получить хороший/лучший ответ. –

+0

. Я добавил более подробно к моему вопросу, пожалуйста, сообщите мне, есть ли другие вещи, которые я мог бы не делать обсудили. –

ответ

0

Право, так что мне удалось превратить присущую последовательное выполнение правил в hierarhical один.

Это достигается за счет использования дополнительной внешней переменной, которая служит в качестве идентификатора правила для последующего выполнения и удвоения количества правил (эти дополнительные правила управления потоком выполнения скрыты от пользователя). Это удваивает мое время выполнения, но по-прежнему приемлемо по сравнению с использованием операции IfElse. Через минуту может быть обработано около 1000000 строк данных.


Структура правила:

Rule_n состоит из 2-х правил:

состояние Rule_n_1 является: RuleIdToBeNextExecuted = п и (правило пользователя)

Оценка Rule_n_1 к True: RuleIdToBeNextExecuted = следующее действие/правило, если Rule_n имеет значение True

Оценка Rule_n_1 to False: никаких действий не предпринималось.

состояние Rule_n_2 является: RuleIdToBeNextExecuted = п AND NOT (правило пользователя)

Оценка Rule_n_2 к True: RuleIdToBeNextExecuted = следующее действие/правило, если Rule_n является Ложные

Оценка Rule_n_2 к Ложные: Нет меры.


Эквивалентная схема для одного в вопросе: More states

Эта структура позволяет мне создавать трубы & фильтра выполнения подхода к правилам пользователя.

Исследования: Моя собственная структура структуры данных.

+2

Можете ли вы опубликовать какие-либо артефакты кода, которые показывают, как вы это сделали? – Snowy

 Смежные вопросы

  • Нет связанных вопросов^_^