DotLiquid,一些初学者 questions/observations

DotLiquid, some beginner questions/observations

我正在调查使用 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,它看起来非常强大(对我的需求来说可能有点矫枉过正?)。我已经开始工作了,但我想问一下我是否以正确的方式处理这个问题?

看来我不得不声明一个 class 即

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();] 如何与其下面的模板变量声明联系起来。是否正在进行某种全局缓存?

  1. 是的,从 Drop 继承是一种方法。 DotLiquid 提供的另一种机制是 Template.RegisterSimpleType(...) - 有关示例,请参见 unit tests

  2. 是的,您确实需要用变量名称限定 属性 名称,如您的示例所示。另一种方法是创建一个 Hash,其中包含 AdditionalInformationDescriptionErrorId 的 top-level 个键,并将其传递给 template.Render(...)。您可以使用 Hash.FromDictionary(...) 来做到这一点,如图 here.

  3. 命名约定与变量声明没有关系。命名约定仅在解析 属性 名称时使用。例如,如果您使用 RubyNamingConvention,那么您需要在模板中写入 {{ emailTemplateInfo.additional_information }}