2012-05-24 3 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

Мне кажется, вам нужно создать пустой шаблон, скопировать созданный класс и использовать его в качестве базового класса. Затем вы можете расширить его с помощью любых необходимых вам свойств. (вам не нужно сохранять пустой шаблон после копирования кода)

Для чего это стоит, я думаю, что то, что вы пытаетесь сделать, вышло из коробки в RTM VS 2010, но VS2010 SP1 изменил так что вы можете сами подклассы шаблонов. Ознакомьтесь с этим connect issue для получения дополнительной информации.

EDIT:

Насколько положить метод электронной почты на базе, то я, вероятно, не будет делать это таким образом. Вы можете думать о подвергая какую-шаблонную службу, которая имеет различные методы на нем, что вам нужно, например:

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 
    } 
} 

Таким образом, вы абстрагируетесь от фактической реализации Т4, так что если что-то делает перерыв где-то по линии вам нужно только исправить это в одном классе.

и разоблачить почтовую службу, которая использует службу шаблонизатор для генерации содержимого почты:

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

Похоже, вы предполагаете, что инъекция конструктора является единственным способом впрыска данных в класс. Однако я предполагаю, что инъекции метода/свойства - лучшие варианты в этом сценарии.

У меня нет компилятора под рукой и вы не можете проверить его точно, но, похоже, он может работать.

Смежные вопросы