2011-05-31 7 views
5

पर पास करें, मेरे पास u1 प्रकार User वर्ग का ऑब्जेक्ट है। उपयोगकर्ता की विशेषता name है। मैं u1 में एक टी 4 टेम्पलेट में कैसे जा सकता हूं?किसी ऑब्जेक्ट को T4 टेम्पलेट

User u1 = new User("John"); 


खाका स्क्रिप्ट:

Hello <# u1.Name #> 

उत्तर

2

आप अपने टेम्पलेट में इसका इस्तेमाल करना चाहते हैं कि मैं बहुत ही सरल कुछ करने के लिए कोशिश कर रहा हूँ? फिर आपको उस प्रकार की असेंबली का संदर्भ जोड़ना होगा। आप टी 4 इंजन के मौजूदा संदर्भ को तब तक पास नहीं कर सकते जब तक कि आप इसे अपने आप को कुछ बेहद अपरंपरागत फैशन में होस्ट न करें (मैंने कभी ऐसा करने के लिए किसी को भी नहीं देखा है)। और यहां तक ​​कि यदि आप दूर तक गए और ऐसा किया कि आप इसे कैसे चलाएंगे? यह संदर्भ कहां से आना चाहिए?

किसी टी 4 टेम्पलेट के भीतर से प्रकार का उपयोग करना संदर्भ जोड़ने या क्लास स्टब <#+ /*stuff goes here*/ #> में कॉपी/पेस्ट करना जितना आसान है।

+0

मैं तुम्हें क्या कहा के कुछ समझते हैं, लेकिन आप इस पर विस्तार कृपया सकता है: 'आप बस टी -4 इंजन जब तक आप की मेजबानी के लिए मौजूदा संदर्भ पारित नहीं हो सकता यह खुद 'है? इसके अलावा, बस आप जानना चाहते हैं, दोनों .tt फ़ाइल और उपयोगकर्ता वर्ग ही समाधान – brainydexter

+1

अधिकार का एक हिस्सा हैं। वैसे संदर्भ को दूर करने का कोई तरीका नहीं है। टी 4 टेम्पलेट वास्तव में अपने डोमेन में चलता है। कई कारणों के लिए। यदि आप टी 4 प्रसंस्करण की मेजबानी करते हैं तो आपको प्रसंस्करण के संदर्भ को पारित करने में सक्षम होना चाहिए, लेकिन ऐसा कुछ नहीं है जिसे मैंने पहले देखा है। आप सबसे अच्छा शर्त या तो सामान आप का उपयोग करें या इसे जोड़ने के लिए, टी -4 वर्ग ठूंठ के हिस्से के रूप करना चाहते हैं के साथ एक विधानसभा संदर्भित करने के लिए किया जाएगा। ओलेग Sych टी -4 के बारे में ब्लॉग, और कैसे इस http://www.olegsych.com/2008/02/t4-assembly-directive/ –

1

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

एक और समाधान एक कस्टम टेम्पलेट का उपयोग करना है जो आपके टी 4 टेम्पलेट में टेम्पलेट प्रतिस्थापन का उपयोग करता है, जैसे कि बहुत सारे स्थापित टेम्पलेट्स काम करते हैं।

+0

करने के लिए आपको बता सकता है के रूप में, मैं तो बस शुरू कर के बारे में विवरण में बहुत कुछ के लिए वहाँ देखो अंधकार। लेकिन, आखिरकार, मैं क्या करना चाहता हूं, टेम्पलेट का एक संकलित ऑब्जेक्ट बनाएं जिसमें उपयोगकर्ता के किसी ऑब्जेक्ट के संदर्भ हों। जब टेम्पलेट अंत में 'रन' होता है, तो यह टेक्स्ट को आउटपुट करने के लिए ऑब्जेक्ट के गुणों का उपयोग करेगा। प्रतिक्रिया के लिए – brainydexter

0

अरे - आप टी -4 स्क्रिप्ट के अंदर मान आदि निर्धारित करने की आवश्यकता है, तो User प्रारंभ <# #> टैग, जो

 <# User u1 = new User() { .Name = "John" } #> 
    Hello <# u1.Name #> 

को कुछ इसी तरह में आप उदाहरण चालू करेंगे आप भी कर सकते हैं जैसा कि ऊपर उल्लेख के अंदर होना चाहिए नामस्थान आयात करने की आवश्यकता है। मैं System.Data तक पहुँच प्राप्त करने के लिए एक टीटी फ़ाइल की शुरुआत में निम्न विवरण का इस्तेमाल किया है:

 <#@ import namespace="System.Data" #> 
    <#@ import namespace="System.Data.SqlClient" #> 
    <#@ assembly name="System.Data" #> 
1

मान लिया जाये कि आप कुछ अनुप्रयोग या उपकरण है कि अंततः टेम्पलेट चलाता है, तो क्रम का उपयोग कर (में कोड करना चाहते हैं preprocessed) < # + #> वर्ग सुविधा ब्लॉक या < # पैरामीटर #> निर्देश में परिभाषित कस्टम गुणों के साथ टेम्पलेट्स आपको निर्देश देना चाहिए जो आप चाहते हैं। http://msdn.microsoft.com/en-us/library/gg586944.aspx

+0

धन्यवाद। हम, टी -4 का उपयोग नहीं करने का फैसला किया है, क्योंकि यह हमें सीमित या तो पर्यावरण बनाम मेजबान का उपयोग करें या टी -4 का इंजन के लिए एक बाहरी कार्यकारी लागू करने के लिए। स्केल हमारी प्राथमिक चिंता थी और प्रति कॉल बाहरी निष्पादन का आह्वान करते थे, यह एक बहुत ही ऑपरेशन है जिसे हम बर्दाश्त नहीं कर सकते थे। कृपया अगर वहाँ इस के लिए एक समाधान नहीं है मुझे पता है, के बाद से मैं वास्तव में टी -4 की शक्ति पसंद है और पूरी तरह से हम क्या कर रहे के लिए बिल है, लेकिन इस संदर्भ में सीमित कर रहा है। – brainydexter

+0

प्रीप्रोसेस्ड tempaltes मेजबान वीएस की आवश्यकता नहीं है। यदि आपका टेम्पलेट टेक्स्ट बिल्ड समय पर तय किया गया है, तो आपको वही करना चाहिए जो आपको चाहिए। – GarethJ

3

हम ने कुछ किया इस के समान:

डॉक्स यहाँ पर एक नज़र डालें। हमारे समाधान निम्नलिखित तत्व होते हैं:

  • कस्टम मेजबान
  • कस्टम टेम्पलेट आधार वर्ग
  • होस्ट विशिष्ट टेम्पलेट्स (टेम्पलेट निर्देश का "hostspecific" संपत्ति)
(टेम्पलेट के निर्देश की संपत्ति "विरासत")

कस्टम होस्ट उस ऑब्जेक्ट द्वारा एकत्रित किया जाता है जो स्टैंसिल स्वयं तरीकों का आह्वान करना चाहता है।

interface ICallbackInterface 
{ 
    void CallbackFxn(); 
} 

[Serializable] 
public class MyCustomHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost, IStencilFileRecordManagement 
{ 

    private ICallbackInterface callback = null; 
    public MyCustomHost(ICallbackInterface cb) 
    { 
     callback = cb; 
    } 

    public void CallbackFxn() 
    { 
     callback.CallbackFxn(); 
    } 
} 

public abstract class MyTemplateBase : TextTransformation 
{ 
    public virtual MyCustomHost CustomHost 
    { 
     get 
     { 
      dynamic metame = this; 
      MyCustomHost rval = null; 
      try 
      { 
       /// <summary> 
       /// The "Host" property will be added to the generated class by the T4 environment whenever a 
       /// "hostspecific" template is processed. 
       /// </summary> 
       rval = metame.Host as MyCustomHost; 
      } 
      catch (RuntimeBinderException e) 
      { 
       logger.ErrorException(
        "Received the following exception while processing a stencil template", e); 

      } 
      return rval; 
     } 
    } 
} 

अब, हमारे टेम्पलेट्स में से किसी के भीतर, हम वस्तु है जो वास्तव में कस्टम मेजबान संपत्ति का उपयोग कर प्रसंस्करण की शुरूआत की है, जैसे पर विधियां प्रारंभ कर सकते हैं:

<# CustomHost.CallbackFxn(); #> 

इसके अलावा, हम का उपयोग नहीं करते वी.एस. में टी -4 या एक अलग निष्पादन का उपयोग कर - हम Microsoft.VisualStudio.TextTemplating.10.0 और Microsoft.VisualStudio.TextTemplating.Interfaces.10.0 विधानसभाओं के खिलाफ लिंक।

संपादित

हम टी -4 टेम्पलेट का उपयोग कर रहे हैं उन हमारे उत्पाद कार्यप्रवाह में किसी विशेष चरण में इस्तेमाल के लिए अपने स्वयं के प्लग-इन को परिभाषित करने के लिए अनुमति देते हैं। तो उपयोगकर्ता टेम्पलेट्स हमारी प्रणाली में अपलोड किए जाएं, और प्रसंस्कृत इस तरह:

using Microsoft.VisualStudio.TextTemplating; 

class UserPluginWorkflowComponent : ICallbackInterface 
{ 
    public void CallbackFxn() 
    { 
     // invoked by user plugin 
    } 

    public void ExecuteUserPlugin() 
    { 
     MyCustomHost host = new MyCustomHost(this); 
     host.TemplateFileValue = "UserPluginTemplateFilename"; 
     Engine engine = new Engine(); 
     string pluginResult = engine.ProcessTemplate(
      userPluginTemplateFileContents, 
      host);    
     if (!host.Errors.HasErrors) 
     { 
      // use pluginResult in some meaningful way 
     } 
    } 
} 
+0

क्या आप थोड़ा सा विस्तार कर सकते हैं? दिखाएं कि ऑब्जेक्ट्स "प्रसंस्करण को बंद कर देता है" कैसे? –