2013-07-11 74 views
0

我正在嘗試編寫一個C#應用程序,它需要數十萬個獨立的數據行,並根據用戶定義的某些規則設置某個屬性。正如我想到的使用規則引擎。經過一些Google搜索之後,我決定使用內置的Windows Workflow Foundation Rules EngineWindows工作流規則引擎可以處理分支嗎?

用於創建規則的接口提供給在一個管道和過濾器樣式的用戶:

原始數據 - >規則1 - >如果結果規則1是真,則執行規則2 /如果結果規則1是假,執行規則3 - > ...執行其他規則的分支... - >取決於所取的分支,屬性設置爲某個值。

我希望能夠以類似的管道和過濾器/分支風格執行規則,而不是像非鏈式規則集那樣按順序執行。我不知道如何創建鏈接規則集的依賴關係來匹配我的流程。我意識到WF有專門針對此類分支的IfElse活動,它們支持類似的規則,但工作流活動的速度要慢兩個數量級。

我是否正確使用這些技術? (我是C#的新手)我應該考慮編寫自己的規則引擎嗎?任何建議表示讚賞。

編輯:關於我所做的研究的其他細節。我搜索了很多博客文章/教程/ msdn資源,我可以在過去一週找到(沒有使用鏈接,有噸,我使用了明顯的關鍵字)。規則引擎規則集似乎專門用於順序獨立規則,並且當它們依賴時,它們通過更改某個變量(這是規則本身中的依賴項)來指示該事實,並導致對這些規則進行重新評估(完全類似於我相信RETE被稱爲全鏈式)。我無法看到一種根據其結構和關係動態地將依賴關係插入到我的規則中的方法。但是,我可以使用IfElse活動來模擬這種控制流程。

我已經實現了700行樣本數據的小規則集並運行了一些測試。 (沒有用於粘貼代碼,我沒有問題)他們評估的時間大約爲50毫秒,而用IfElse Activities和相同規則構建的等效邏輯在aprox中進行評估。 2秒,我猜測它來自交換活動的開銷。我要麼沒有正確地使用這些技術(我的意思是我沒有意識到規則集的特性需要在獨佔分支中更好地評估,或者更快的切換活動),或者沒有簡單的方法來控制執行流規則集,因此我必須對這些活動產生巨大的性能損失。在這種情況下,我不妨寫我自己的規則引擎。

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

+0

向我們展示您在研究中所付出的一些努力,添加更多詳細信息以改善您的更改以獲得更好/更好的答案 –

+0

我已經爲我的問題添加了更多詳細信息,請讓我知道是否有其他事情可能不會已經討論過。 –

回答

0

對,所以我成功地把規則的固有順序執行到hierarhical之一。

這是通過使用一個額外的外部變量作爲下一個要執行的規則id和規則數量的兩倍(這些額外的「執行流控制」規則對用戶隱藏)來實現的。這使我的執行時間加倍,但與使用IfElse活動相比仍然可以接受。大約1000000行數據可以在一分鐘內處理。一個規則的


結構:

Rule_n由2個規則:

Rule_n_1的條件是:RuleIdToBeNextExecuted = N和(用戶規則)

Rule_n_1的評價爲True: RuleIdToBeNextExecuted =下一個動作/規則,如果Rule_n爲真

Rule_n_1的評估假:沒有采取任何行動。

Rule_n_2的條件是:RuleIdToBeNextExecuted = N和NOT(用戶規則)

Rule_n_2的評估爲True:RuleIdToBeNextExecuted =下一個動作/規則,如果Rule_n是假

Rule_n_2的評估爲False:不採取任何行動。


等效圖的一個在這個問題:More states

這種結構允許我創建一個管道&濾波執行方式給用戶的規則。

研究:我自己的數據結構設計。

+2

你可以發佈任何種類的代碼工件,顯示你如何實現這個? – Snowy

相關問題