2017-02-08 34 views
1

Я изучаю, используя dotliquid, чтобы заменить домашний код шаблона, и мне интересно, как лучше всего достичь моей цели.DotLiquid, некоторые вопросы/наблюдения начинающего

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

Specific error: {#ErrorId#} 
Error description: {#Description#} 
Additional information:{#AdditionalInformation#} 

И в коде C#:

Dictionary<string, string> tokensAndValues = new Dictionary<string, string> 
{ 
    {@"ErrorId", errorId}, 
    {@"Description", description}, 
    {@"AdditionalInformation", additionalInformation} 
}; 

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

Кажется, я вынужден объявить класс, а именно.

public class EmailTemplateInfo : Drop 
{ 
    public string ErrorId { get; set; } 
    public string Description { get; set; } 
    public string AdditionalInformation { get; set; } 
} 

И затем использовать его следующим образом:

Template.NamingConvention = new CSharpNamingConvention(); 
Template template = Template.Parse(templateText); 

EmailTemplateInfo emailTemplateInfo = new EmailTemplateInfo 
{ 
    AdditionalInformation = additionalInformation, 
    Description = description,      
    ErrorId = errorId 
}; 

string htmlText = template.Render(Hash.FromAnonymousObject(new {emailTemplateInfo = emailTemplateInfo })); 

Несколько вопросов:

  1. Является ли это правильный способ сделать это? Если это так, я предлагаю сделать дополнение к документам, демонстрирующим эту функциональность.

2. Во-вторых, в шаблоне, который я использую, мне нужно квалифицировать заполнители с именем переменной как это?

Specific error: {{emailTemplateInfo.ErrorId}} 
Error description: {{emailTemplateInfo.Description}} 
Additional information:{{emailTemplateInfo.AdditionalInformation}} 

3. я не могу видеть, как декларация именования [Template.NamingConvention = new CSharpNamingConvention();] в связи с шаблоном описания переменных ниже него. Существует ли какое-то глобальное кэширование?

ответ

3
  1. Да, унаследовавший от Drop - это один из способов сделать это. Другой механизм, который предоставляет DotLiquid, - Template.RegisterSimpleType(...) - см. Примеры unit tests.

  2. Да, вам нужно квалифицировать имена свойств с именем переменной, как в вашем примере. Альтернативой было бы создать Hash, содержащий клавиши верхнего уровня для AdditionalInformation, Description, ErrorId и передать это template.Render(...). Вы можете сделать это, используя Hash.FromDictionary(...), как показано на рисунке here.

  3. Соглашение об именовании не имеет связи с объявлением переменной. Соглашение об именах используется только при разрешении имен свойств. Например, если вы использовали RubyNamingConvention, тогда вам нужно будет написать {{ emailTemplateInfo.additional_information }} в вашем шаблоне.

+0

Re 1. Это хорошо, потому что я сохраняю свои модели отдельно, и теперь им не нужна ссылка на DotLiquid. Протестировано и работает - спасибо Re 2. - любые примеры этого в модульных тестах Re 3. - Как «шаблон» (строчный) знает, что он должен использовать соглашение C# над Ruby? Существует ли какое-то глобальное кэширование? – noonand

+0

Re (2), я обновил свой ответ, включив ссылку на пример использования 'Hash.FromDictionary'. Re (3), 'Шаблон.NamingConvention' является статическим свойством, поэтому он глобальный. Не отличный дизайн API, но в моей защите DotLiquid был моим первым проектом с открытым исходным кодом, я действительно не знал, что делаю :) –

+0

Тим, спасибо большое, я ценю все усилия, которые вы поставили (и продолжайте положить) в этот проект. Он делает все, о чем я просил, и мелочи, такие как статическая опора, (IMHO) несущественны. Оцените свою помощь и по этому вопросу. – noonand