在我正在开发的项目中,有一个现有的消息传递系统可以发送应用内消息和电子邮件。所有消息目前都是硬编码的,带有特定变量的占位符(名称,日期,类似的东西)。
项目的即将到来的要求是使所有这些消息可配置。细节并不是非常重要,重要的是这些要点:
1)消息应该能够从我们的ORM中获取任何对象,并用来自对象的值替换消息内容的部分内容。例如,$ {User.FirstName}或$ {Customer.IsEnabled}等等。
2)系统管理员可以轻松编辑消息。所以编译内容(除非它是动态完成的)是不行的。
3)理想情况下,我将有一种方法可以验证消息是否“有效”,并且可以正确解析。不是一个要求(我打算为他们制作一个沙箱,但它会很好。)
任何人都有任何关于最佳方式的建议吗?
答案 0 :(得分:1)
您确实需要将问题划分为一些离散的子问题:
所以,这里有一些关于每个子问题的建议:
模板存储库:我会考虑最初使用一种简单的机制,但是允许系统管理员进行更改而不会冒任何其他问题。出于这个原因,我可能会排除web / app配置文件 - 并使用设置文件或(如果您的应用已经使用它)数据库表。您可能希望为每个模板提供稳定的内部标识符以及可自定义的名称。代码将依赖于稳定的标识符,而名称只是管理员组织这些模板的便捷方式。
解析标记:这是正则表达式似乎是合理选择的地方。解析$(...)形式的模式并不是非常困难。
解释/评估标记:这是您问题中较复杂的部分之一。除非性能是最重要的,否则我可能会使用反射和一些字符串操作来完成这项工作。如果您可以将替换标记限制为仅引用ORM对象的公共属性,那么生活也会变得更加简单。然后你可以根据'。'分割字符串。字符然后使用迭代逻辑来获取相应属性的值,直到达到最终值。
编译/运行时验证:这是一个很高的订单。你肯定希望让所有其他作品先发挥作用。一旦你这样做,实现这一点的一种方法可能是在app启动时加载所有模板,访问每个模板并确保模板中的标记都存在于ORM中的对象类型中。由于看起来您已经将对象类型名称添加到标记中,因此这应该是可能的。不幸的是,您可能无法重用与评估标记相同的逻辑来验证它们 - 因为验证时您没有类型的实例 - 只是它们的类型信息。