如何从razor引擎获取ITemplate(IrazorenEngineService)

如何从razor引擎获取ITemplate(IrazorenEngineService),razor,razorengine,Razor,Razorengine,我刚刚将RazorEngine参考更新为3.7.5版。许多事情似乎已经改变,变得过时了。 对于大多数事情,我想出了“新方法”,除了一件事:获得一个ITemplate实例 我们曾经使用模板服务实例。它有一个方法Resolve,该方法返回一个ITemplate实例 模板服务已替换为IRazorEngineService。这没有任何方法返回ITemplate 正确的检索方法是什么?正如我已经在一些线程中讨论过的,这里有一些引用: 您能否详细说明为什么需要直接访问该接口的实例? 我决定删除对它的直接访问

我刚刚将RazorEngine参考更新为3.7.5版。许多事情似乎已经改变,变得过时了。 对于大多数事情,我想出了“新方法”,除了一件事:获得一个
ITemplate
实例

我们曾经使用
模板服务
实例。它有一个方法
Resolve
,该方法返回一个
ITemplate
实例

模板服务已替换为
IRazorEngineService
。这没有任何方法返回
ITemplate


正确的检索方法是什么?

正如我已经在一些线程中讨论过的,这里有一些引用:

您能否详细说明为什么需要直接访问该接口的实例? 我决定删除对它的直接访问,因为它不容易使用,而且大多数情况下并不像您认为的那样。如果您使用隔离API,它也会导致问题

如果是关于设置自定义布局,正确的升级路径是使用自定义
TemplateBase
并使用ViewBag(如链接问题所述)

另一个更有趣的用例是从模板中获取数据。 这里详细讨论了这一点:

下面是一个关于如何从给定模板中提取“主题”的代码示例

模板:

@model HelloWorldModel
@{
    Layout = "CI";
    Subject = "Hello World";
}
Hello @Model.Name,<br/>
this is a test email...
@model HelloWorldModel
@{
布局=“CI”;
主题=“你好,世界”;
}
你好@Model.Name,
这是一封测试邮件。。。
代码(简化)

类CustomDataHolder{
公共字符串目标{get;set;}
公共字符串主题{get;set;}
}
//在自定义TemplateBase类中:
公共字符串Subject{get{return Viewbag.DataHolder.Subject;};set{Viewbag.DataHolder.Subject=value;}
//你的代码
公共静态任务SendEmailAsync(字符串模板名、字符串目标、T模型)
{
var holder=新的CustomDataHolder();
动态视图包=新的动态视图包();
viewbag.DataHolder=holder;
目的地=目的地;
var body=Engine.Razor.Run(templateName,typeof(T),model,(DynamicViewBag)viewbag);
MailMessage msg=新的MailMessage();
msg.To.Add(新邮件地址(持有者目的地));
msg.Subject=holder.Subject;
msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(body,null,MediaTypeNames.Text.Html));
SmtpClient SmtpClient=新的SmtpClient();
返回smtpClient.SendMailAsync(msg);
}
希望这涵盖了您的用例。否则,请在您的问题中添加更多信息,说明您试图通过
ITemplate
实例实现什么

class CustomDataHolder {
    public string Destination { get; set; }
    public string Subject { get; set; }
}
// In the custom TemplateBase class:
    public string Subject { get { return Viewbag.DataHolder.Subject; }; set { Viewbag.DataHolder.Subject = value; } }

// Your code
public static Task SendEmailAsync<T>(string templateName, string destination, T model)
{
    var holder = new CustomDataHolder ();
    dynamic viewbag = new DynamicViewBag();
    viewbag.DataHolder = holder;
    holder.Destination= destination;
    var body = Engine.Razor.Run(templateName, typeof(T), model, (DynamicViewBag)viewbag);

    MailMessage msg = new MailMessage();
    msg.To.Add(new MailAddress(holder.Destination));
    msg.Subject = holder.Subject;
    msg.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html));

    SmtpClient smtpClient = new SmtpClient();
    return smtpClient.SendMailAsync(msg);
}