2012-05-24 73 views
0

我正在嘗試做什麼

我正在嘗試使用T4創建郵件消息模板。定製T4預處理模板

我使用的是預處理模板,而如果我understoo正確的,是我必須做的,如果我想在運行時生成的消息不會對Microsoft.VisualStudio.TextTemplating組件引入依賴。

因爲我想一些數據傳遞給我的模板,我添加的參數吧:

<#@ template language="C#" #> 
<#@ parameter name="Param1" type="System.String" #> 
<#@ parameter name="Param2" type="System.  
Lorem <#= Param1 #> dolor <#= Param2 #> 

然後我可以生成消息傳遞的參數如下:

static void Main(string[] args) { 
    var template = new LoremIpsum(); 
    template.Session = new Dictionary<string, object>() { 
     {"Param1", "ipsum"}, 
     {"Param2", "sit amet"}, 
    }; 
    template.Initialize(); 
    string text = template.TransformText(); 
} 

有什麼問題

由於我需要生成幾個這些類,我希望他們都有一個通用的方法來發送郵件,如下所示:

public void SendMail(string to, IDictionary<string, object> parameters) 

,或者甚至更好:

public void SendMail(string to, string Param1, string Param2) 

由於生成的類是局部的,也可以添加方法,以增加他們的另一部分類的聲明,但是這將意味着我將不得不重複(或多或少)所有生成的類的相同代碼。

我試了一下,到目前爲止

我試圖創建一個基類,但如果我嘗試這樣做:

<#@ template language="C#" inherits="MailTemplateBase" #> 

然後將生成的代碼中斷,所生成的類是依靠LoremIpsumBase基類,它定義了一些輔助方法(我真的沒有看到每個生成的類都從一個幾乎完全相同但不同的基類繼承而來)。

問題

  1. 我怎麼能有我的模板的基類?
  2. 如何生成接受與模板中聲明的相同參數的方法?

回答

2

我認爲你需要創建一個空模板,複製創建的類並將其用作基類。然後,您可以使用您需要的任何屬性來擴展它。 (一旦你複製了代碼,你不需要保留空模板)

對於什麼是值得我認爲你在VS 2010 RTM中開箱即用,但VS2010 SP1改變了行爲,以便您可以自己繼承模板。查看connect issue瞭解更多信息。

編輯:

至於把郵件法的基礎得好,我可能不會那樣做。你可能要考慮一些露出那種上有各種方法模板的服務,你需要,如:

public class TemplatingService : ITemplatingService 
{ 
    public string GenerateReminderMessage(string to, string name) 
    { 
     // Construct the template, passing in the parameters into the session as required 
     ... 
     // Return the results of the template transformation 
    } 
} 

所以如果事情不破的地方你抽象從實際執行T4走這樣只需要在一個班級中修復它即可。

和揭露使用該模板的服務生成郵件內容的郵件服務:

public class MailService : IMailService 
{ 
    public void SendReminderEmail(string to, string name) 
    { 
     var message = this.TemplatingService.GenerateReminderMessage(to, name); 
     this.MailerService.SendEmail(to, message); 
    } 
} 

注意,MailerService將只是一個簡單的包裝圍繞.NET郵件代碼,但它將使你單位單獨測試MailService。

你可能有更多的方法可以將它抽象出來,但這將是一個開始。

希望有所幫助。

+0

我編輯了這個問題相當多,但我認爲複製生成的基類並使用它作爲基類將是要走的路。恐怕這可能會破壞下一個VS版本或更新,雖然... –

+0

是的,我可以理解,考慮到它在RTM和SP1之間打破。 –

+0

請參閱我的更新以獲取有關如何推進這項工作的建議。 –

0

這聽起來像你假設構造函數注入是將數據注入類的唯一方法。不過,我認爲在這種情況下metod /財產注入是更好的選擇。

我手頭沒有編譯器,無法確認它,但它似乎可以工作。