从模板

时间:2016-10-19 11:50:07

标签: c# .net razorengine

故事

我想从模板生成邮件。

模板看起来与此类似:

<h1>@Model.Name</h1>
@foreach(var row in Model.Rows)
{
    <p>@row</p>
}
@if(Model.Case)
{
    <p>Thats the case</p>
} 

这些模板存储在数据库中,每个用户只有少量(~10个),并且可能会被修改。

到目前为止,我们使用了RazorEngine,我们只需要调用Razor.Parse()。这对我们来说很好,直到我们遇到磁盘空间问题。 (Parse()在temp文件夹的每个调用中生成一个新程序集,所以它们中有很多个)

我尝试了什么

所以我认为我需要切换到使用RazorEngines新功能Compile(), Run(), RunCompile()认为可以编译模板(给它DB-Id作为模板键)进行更改时所以我只有一个每个模板的装配。然后,当我需要带有数据的邮件时,我会调用'Run()'。但这是不可能的。另一个问题是内存泄漏,因为每个模板程序集都将保留在缓存中。

我们还查看了stringtemplate.org(c#开发状态看起来不太好)和Microsofts MailDefinition(只能用于变量,不支持循环......)

我在寻找什么

基本上我正在寻找一个不缓存任何内容的RazorEngine。我使用Razor.Parse()并且没有任何性能问题。

RazorEngine中是否有设置,我没有看到,禁用缓存? RazorEngine有替代品吗?或者甚至有不同的方法从模板生成邮件?

1 个答案:

答案 0 :(得分:0)

Have you looked into T4 Text Templates? You can build design-time or run-time text templates that "compile" to anything. A few examples of this in the real world:

  • Entity Framework uses these to generate your C# model files (.cs)
  • You can use T4 templates to generate .sql files (or just SQL statements) containing C# code (variables, conditions, etc) which gets executed at runtime
  • ASP.NET MVC uses T4 templates behind the scenes when generating views and controllers using scaffolding

"Executing" the template is as easy as one line of code:

var templateOutput = new MyTemplateClass().TransformText();

There are more advanced options, such as passing in parameters/variables to the template, which are documented well in MSDN.