Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NVelocity(或Velocity)作为独立公式计算器_C#_.net_Velocity_Nvelocity - Fatal编程技术网

C# NVelocity(或Velocity)作为独立公式计算器

C# NVelocity(或Velocity)作为独立公式计算器,c#,.net,velocity,nvelocity,C#,.net,Velocity,Nvelocity,我在应用程序中使用NVelocity生成html电子邮件。我的应用程序有一个事件驱动模型,保存和/或更新对象会导致发送这些电子邮件。每个事件可以触发零封、一封或多封电子邮件 我希望能够配置在运行时发送哪些电子邮件,而无需修改代码。我在想我可以利用NVelocity#if()指令来实现这一点。这是我的想法 步骤1)在发送电子邮件之前,管理员必须配置要评估的nLocality公式。例如: $User.FirstName == "Jack" String formula = GetFormulaFr

我在应用程序中使用NVelocity生成html电子邮件。我的应用程序有一个事件驱动模型,保存和/或更新对象会导致发送这些电子邮件。每个事件可以触发零封、一封或多封电子邮件

我希望能够配置在运行时发送哪些电子邮件,而无需修改代码。我在想我可以利用NVelocity#if()指令来实现这一点。这是我的想法

步骤1)在发送电子邮件之前,管理员必须配置要评估的nLocality公式。例如:

$User.FirstName == "Jack"
String formula = GetFormulaFromDB(); // $User.FirstName == "Jack"
String templ = "#if( " + formula + ") 1 #else 0 #end";
步骤2)保存或创建对象时,根据输入公式在内存中构建一个NVelocity模板。例如:

$User.FirstName == "Jack"
String formula = GetFormulaFromDB(); // $User.FirstName == "Jack"
String templ = "#if( " + formula + ") 1 #else 0 #end";
步骤3)针对模板在内存中执行NVelocity引擎。检查结果,查看是否必须发送电子邮件:

String result = VelocityMerge(templ); // utility function 
if( result.Trim() == "1" )
{
    SendEmail();
}
我知道这并不是NVelocity的初衷,但我认为它可能会起作用:)这样做的好处之一是,公式可以使用与模板中相同的语法

有人有什么警告或建议吗?有没有一种方法可以执行#if()指令而不像我上面提到的那样跳过障碍?有没有推荐的方法提前验证公式语法


谢谢。

如果更改标准的是非技术最终用户,我会非常小心地验证他的输入。如果NVelocity投诉您拒绝输入,则可以通过对输入运行模板(即
VelocityMerge()
方法)轻松验证输入,否则将其保存到数据库

另一个限制是,正如serg555所评论的,您必须预先知道标准上可能存在的所有变量。某些邮件模板可能需要一个其他邮件不需要的变量,但您仍然必须使其可用于所有模板。这是否是真正的限制取决于邮件模板的同质性(?)


此外,定义标准的最终用户必须知道所有可用变量(例如,
$user
)和每个变量的属性(例如FirstName、LastName等)。可能是一些帮助屏幕列出了它们。

如果非技术最终用户是更改标准的人,我会非常小心地验证他的输入。如果NVelocity投诉您拒绝输入,则可以通过对输入运行模板(即
VelocityMerge()
方法)轻松验证输入,否则将其保存到数据库

另一个限制是,正如serg555所评论的,您必须预先知道标准上可能存在的所有变量。某些邮件模板可能需要一个其他邮件不需要的变量,但您仍然必须使其可用于所有模板。这是否是真正的限制取决于邮件模板的同质性(?)


此外,定义标准的最终用户必须知道所有可用变量(例如,
$user
)和每个变量的属性(例如FirstName、LastName等)。一些帮助屏幕可能会列出它们。

很好!谁决定对每封邮件使用什么标准?最终用户?系统管理员?你?我认为这应该很有效,只要你知道方程中可以使用的所有变量,因为你需要在计算之前把它们都放到上下文中。谢谢你的评论。。。有一个web界面来创建电子邮件,因此理论上最终用户可以。但实际上,不会马上有很多这样的变量,所以在我们记录哪些变量可用之前,我很可能会参与其中。很好!谁决定对每封邮件使用什么标准?最终用户?系统管理员?你?我认为这应该很有效,只要你知道方程中可以使用的所有变量,因为你需要在计算之前把它们都放到上下文中。谢谢你的评论。。。有一个web界面来创建电子邮件,因此理论上最终用户可以。但事实上,现在不会有太多的变量,所以我很可能会参与其中,直到我们记录哪些变量可用。谢谢Mauricio。我认为在保存到数据库之前运行VelocityMerge()函数是一个很好的建议。每封电子邮件都将绑定到一个对象类型,即$User vs$Product。因此,相同类型的每封电子邮件都有相同的变量名。我可以创建一个全局实用程序类来传递到所有模板中。在这一点上,我想我有一个良好的开端。再次感谢你的提示和确认我的想法的有效性。仅供参考-我正在使用此帖子()作为合并的基础。谢谢毛里西奥。我认为在保存到数据库之前运行VelocityMerge()函数是一个很好的建议。每封电子邮件都将绑定到一个对象类型,即$User vs$Product。因此,相同类型的每封电子邮件都有相同的变量名。我可以创建一个全局实用程序类来传递到所有模板中。在这一点上,我想我有一个良好的开端。再次感谢你的提示和确认我的想法的有效性。仅供参考-我正在使用此帖子()作为合并的基础。