2011-06-22 13 views
5

मेरा .NET एप्लिकेशन रनटाइम पर उपयोगकर्ता परिभाषित नियमों का मूल्यांकन करता है। ये नियम उपयोगकर्ता द्वारा जीयूआई मेनू के माध्यम से सिस्टम में प्रवेश किए जाते हैं। मैं एक तार्किक बयान उत्पन्न करता हूं जो इसके अनुरूप है और इसे डेटाबेस में संग्रहीत करता है।नियम इंजन - संपादन पर पार्सिंग से बचने के लिए नियमों को कैसे संग्रहीत करें?

उदाहरण के लिए: (नाम = 'जॉन' और उपनाम = 'स्मिथ') या संख्या> 12

हालांकि, जब उपयोगकर्ता जीयूआई द्वारा किसी नियम को संपादित करना चाहता है, मैं निर्धारित करने के लिए एक रिवर्स आपरेशन करने की जरूरत है संग्रहित नियम से मेनू राज्य, जो महंगा और जटिल है। आप नियमों को इस तरह से स्टोर करने की अनुशंसा कैसे करेंगे कि इसे मेनू राज्यों में आसानी से उलट किया जा सके?

+1

यह आपके द्वारा समर्थित नियमों और उपयोगकर्ता को कितनी लचीलापन प्रदान करने पर एक बड़ा सौदा करने जा रहा है। –

+2

यदि आपके नियम जटिल हैं, तो यह नियम प्रबंधन प्रबंधन कोडिंग के बजाए एक स्थापित व्यवसाय नियम इंजन को लागू करना समझ में आता है। सरल जीयूआई मेनू और गतिशील कथन पीढ़ी के मुकाबले नियमों के लिए बहुत कुछ है। – Kizz

उत्तर

5

आप AST रों के रूप में नियमों की दुकान सकता है - कुछ वर्गों है कि पेड़ के नोड्स प्रतिनिधित्व लागू:

interface INode 
{ 
} 

enum BinaryOperator 
{ 
    AND, OR, Equal, Greater, Lower; 
} 

class BinaryExpression : INode 
{ 
    BinaryOperator Operator { get; set; } 
    INode Left { get; set; } 
    INode Right { get; set; } 
} 

class PropertyRerefence : INode 
{ 
    string PropertyName { get; set; } 
} 

class Constant : INode 
{ 
    string Value { get; set; } 
} 

अपने उदाहरण के लिए पेड़ इस प्रकार दिखाई देगा:

BinaryExpression(OR) 
    Left=BinaryExpression(AND) 
      Left=... 
      Right=... 
    Right=BinaryExpression(Greater) 
      Left=PropertyReference("Number") 
      Right=Constant("12") 

आप तब ऐसे पेड़ों को बचाने के लिए सीरियलाइजेशन (सर्वश्रेष्ठ JSON, या XML, शायद बाइनरी भी हो सकता है यदि आप डीबी में पठनीयता की परवाह नहीं करते) का उपयोग कर सकते हैं। Deserialization पर, आपको किसी भी पार्सिंग करने की आवश्यकता नहीं है और मेनू को पॉप्युलेट करने के लिए पेड़ को पार कर सकता है।

प्रिंटिंग "(नाम = 'जॉन' और उपनाम = 'स्मिथ') या संख्या> 12" जब आपके पास एएसटी है - बाइनरीएक्सप्रेस के लिए: प्रिंट बाएं, प्रिंट ऑपरेटर, प्रिंट राइट।

आप कहते हैं कि आपके पास पहले ही मूल्यांकन लागू है इसलिए मैं इसे छोड़ दूंगा। आप this question पर भी देख सकते हैं।

संबंधित मुद्दे