2012-09-20 5 views
5

मुझे यकीन है कि यह एक बहुत ही अजीब आवश्यकता है, लेकिन यहां जाता है।मैं एक एएसपी.नेट एमवीसी वेबसाइट के भीतर से डाउनलोड करने योग्य सी # कक्षा कैसे उत्पन्न कर सकता हूं?

हमारे पास कुछ ग्राहक विन्यास कोड है जो सी # कक्षाओं द्वारा दर्शाया गया है जिसे हम कक्षा पुस्तकालय में संकलित करते हैं। इन विन्यास वर्गों को बनाना वर्तमान में बंदर का काम है जिसे मैं किसी डेवलपर के अलावा किसी अन्य को असाइन करना चाहता हूं। इसलिए हम एक "कॉन्फ़िगरेटर" वेबसाइट बना रहे हैं जो एक व्यावसायिक विश्लेषक चयनित सी # कक्षाओं को चयनित प्रासंगिक विकल्पों के साथ फ़ॉर्म भरकर उपयोग कर सकता है।

एमवीसी वेबसाइट में टेम्पलेट से सी # कक्षा उत्पन्न करने का सबसे अच्छा तरीका क्या है? ध्यान दें कि मैं गतिशील रूप से उत्पन्न करने और रनटाइम पर कक्षा को निष्पादित करने के बारे में बात नहीं कर रहा हूं: हम अनिवार्य रूप से एक टेक्स्ट फ़ाइल उत्पन्न कर रहे हैं जो सी # कोड को शामिल करने के लिए होता है जिसे पूरी तरह से अलग परियोजना में शामिल किया जाएगा।

यह ठीक से Google के लिए एक बहुत ही कठिन विषय साबित हो रहा है! विकल्प अब तक आए कि है ...

  • सिर्फ एक tokenized पाठ फ़ाइल का उपयोग और String.Format
  • का उपयोग कर मूल्यों की जगह
  • किसी तरह एक templating इंजन के रूप में उस्तरा उपयोग करें (लेकिन यकीन नहीं कैसे, और यह हम HTML नहीं कर रहा है 'फिर से पैदा करने)
  • किसी भी तरह टी -4 टेम्पलेट्स (कम से कम मुझे यकीन है कि रनटाइम पर अमल करने के लिए कि यह कैसे सी # उत्पन्न करने के लिए प्रयोग किया जाता है पता है, लेकिन नहीं)

कैसे सबसे अच्छा यह दृष्टिकोण पर कोई भी विचार का उपयोग करें?

अनुरोध के रूप में, यहां आउटपुट क्लास/फ़ाइल का एक उदाहरण दिया गया है। यहां क्लाइंट-विशिष्ट लेबल, सत्यापन आदि के साथ बेस क्लास में सेट मानों को ओवरराइड मानते हैं। इस प्रकार हम ग्राहकों के लिए अपने उत्पाद को कस्टमाइज़ करते हैं।

public class AreaRiskTemplate: AreaRiskTemplateBase 
{ 
    public override string EntityName { get { return "risk"; } } 
    public override string EntityNamePlural { get { return "risks"; } } 
    public override string EntityNameArticle { get { return "a"; } } 
    public override string CGovItemRefPrefix { get { return "R"; } } 
    public override void SetFieldDefinitions() 
    { 

     FieldDefinitions.Level1.IsImplemented = true; 
     FieldDefinitions.Level1.Label = "Category"; 
     FieldDefinitions.Level1.IsVisibleInGrid = true; 

     FieldDefinitions.Level2.IsImplemented = true; 
     FieldDefinitions.Level2.Label = "Team"; 
     FieldDefinitions.Level2.IsVisibleInGrid = true; 

     FieldDefinitions.Description.IsImplemented = true; 
     FieldDefinitions.Description.Label = "Description"; 
     FieldDefinitions.Description.IsVisibleInGrid = true; 

    } 
    public override ModelStateDictionary Validate() 
    { 
     var msd = new ModelStateDictionary(); 
     // add template-specific validation here 
     msd.Merge(base.Validate()); 
     return msd; 
    } 
    public override List<string> Level1Options 
    { 
     get 
     { 
      return new List<string> 
       { 
        "Organisational", 
        "Financial", 
        "Operational", 
        "External", 
      "IT" 
       }; 
     } 
    } 
} 

अद्यतन: वर्तमान में जांच कर रही http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx (नीचे टिप्पणी करने के लिए धन्यवाद) पर टी -4 टेम्पलेट्स। उम्मीद तो दिखती है।

+1

http://msdn.microsoft.com/en-us/library/bb126445.aspx रनटाइम पर टी 4 के साथ शुरू करने के बारे में विस्तार शामिल है। –

+0

यह भी रुचि का हो सकता है: http://code.msdn.microsoft.com/windowsdesktop/Single-File-Generator-94d856d4 – Magrangs

+0

क्या आप इस कॉन्फ़िगरेशन फ़ाइल की तरह दिखने का एक उदाहरण पोस्ट कर सकते हैं? –

उत्तर

1

मैं वेबसाइट से बचने का सुझाव देता हूं, और इसके बजाय बस कोडस्मिथ के साथ जा रहा हूं। आप कोडस्मिथ स्क्रिप्ट को डिज़ाइन कर सकते हैं ताकि वह जानकारी मांगे और फिर आवश्यक कोड उत्पन्न कर सके। बहुत कम काम की तरह लगता है, हालांकि आपको कोडस्मिथ खरीदना है।

+0

सुझाव के लिए धन्यवाद। मैंने अतीत में कोडस्मिथ का काफी उपयोग किया है। मुझे लगता है कि मेरी समस्या यह है कि इस उदाहरण में मैं गैर-तकनीकी लोगों को डेटा इनपुट करना चाहता हूं जो कक्षाओं की पीढ़ी के लिए अनुमति देता है। डेवलपर तब लॉग इन करेगा और उस डेटा के आधार पर कक्षाएं डाउनलोड करेगा। यह काफी संभव है कि मैंने पिछले 7 सालों में कोडेस्मिथ का दायरा बदल दिया है, लेकिन मुझे लगता है कि यह इनपुट इंटरफेस गायब है। – centralscru

+1

@centralscru - कोडस्मिथ आपको एक संवाद बॉक्स बनाने की अनुमति देता है जो पीढ़ी में उपयोग किए जाने वाले पैरामीटर स्वीकार करता है। अंतिम उपयोगकर्ता सिर्फ स्क्रिप्ट चलाता है, बक्से में भरता है, और क्लिक ठीक है। फिर आप उन जेनरेट कक्षाओं को यूएनसी शेयर में सहेज सकते हैं। –

0

कम से कम ओवरहेड के साथ ऐसा करने की विधि माइक्रोसॉफ्ट के CodeDOM API में निर्मित का उपयोग करना होगा। यह आपको क्रॉस-भाषा संगत दस्तावेज़ ऑब्जेक्ट मॉडल के साथ सीएलआर कोड दस्तावेज़ों का निर्माण और कुशलतापूर्वक उपयोग करने की अनुमति देता है।

इस दृष्टिकोण का एकमात्र नकारात्मक पक्ष यह है कि यह तुरंत स्पष्ट नहीं है कि कुछ भाषा विशिष्ट विशेषताओं को कैसे कार्यान्वित किया जाए। एक उदाहरण सी # readonly फ़ील्ड है, क्योंकि वे प्रत्येक सीएलआर भाषा में उपलब्ध नहीं हैं, बल्कि केवल सी # में उपलब्ध हैं। इस विशेष जटिलता का समाधान CodeSnippet का उपयोग करना है और मैन्युअल कोड को स्ट्रिंग के रूप में डालना है। कोडडॉम को एक टेम्पलेटिंग इंजन के साथ एकीकृत करके अन्य जटिल मेल-मिलाप मुद्दों को कम किया जा सकता है। ओलेग सिच ने a useful article on integrating CodeDOM with the T4 templating engine लिखा था। मैं शुद्ध पाठ-जनरेशन दृष्टिकोण के इस तरह के दृष्टिकोण को प्राथमिकता देता हूं, क्योंकि दृढ़ता से टाइप किए गए दस्तावेज़ ऑब्जेक्ट मॉडल शुद्ध पाठ से कम त्रुटि प्रवण होता है।

इसके अलावा, यदि आप कभी भी आउटपुट कोड को संकलित करने के लिए कदम उठाते हैं, तो यह कोडडॉम एपीआई द्वारा भी समर्थित है।

यदि यह एक ऐसा अभ्यास है जो आपको लगता है कि आप बहुत उपयोग कर सकते हैं, तो आप builder pattern का उपयोग करके कुछ सामान्य डोम मैनिपुलेशन कार्यक्षमता को धाराप्रवाह विधि कॉल में लपेटना चाहेंगे। मैंने एक व्यक्तिगत पुस्तकालय बनाया है जो इस दृष्टिकोण का उपयोग करता है और यह कोड उत्पादन के माध्यम से मेरी उत्पादकता में वृद्धि करने में बहुत सफल रहा है।

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