DotLiquid, некоторые вопросы/наблюдения новичков

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

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

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

И в коде С#:

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();] связано с объявлением переменной шаблона под ним. Происходит ли какое-то глобальное кэширование?


person noonand    schedule 08.02.2017    source источник


Ответы (1)


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

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

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

person Tim Jones    schedule 13.02.2017
comment
Относительно 1. Это хорошо, потому что я держу свои модели отдельно, и теперь им не нужна ссылка на DotLiquid. Протестировано и работает - спасибо Re 2. - любые примеры этого в модульных тестах Re 3. - как шаблон (нижний регистр) знает, что он должен использовать соглашение C # по сравнению с Ruby? Происходит ли какое-то глобальное кэширование? - person noonand; 13.02.2017
comment
Что касается (2), я обновил свой ответ, включив в него ссылку на пример использования Hash.FromDictionary. Re (3), Template.NamingConvention — это статическое свойство, поэтому оно глобальное. Не лучший дизайн API, но в свою защиту DotLiquid был моим первым проектом с открытым исходным кодом, я действительно не знал, что делаю :) - person Tim Jones; 14.02.2017
comment
Тим, большое спасибо, я ценю все усилия, которые ты вложил (и продолжаешь вкладывать) в этот проект. Он делает все, что я от него просил, а такие мелочи, как статическая опора, (ИМХО) несущественны. Также оцените вашу помощь в этом вопросе. - person noonand; 14.02.2017
comment
@TimJones Почему люди так много внимания уделяют Drop? Я использовал Template.RegisterSafeType(Type, string[]) с составными вложенными моделями, которые содержат другие модели, словарь - отлично работает. Единственная проблема, которая у меня есть - как использовать {{ model.dict.key | filter }} и применять определенную культуру, только не такую, как ... filter:"xx-Xx" В принципе, Context доступен в фильтрах? - person T.S.; 30.08.2019