您有两个问题:对条件进行建模,并将它们存储在数据库中。
建模条件:如果您可以使用现有的脚本语言模型或类似的东西,可能会更容易。如果不能,您可以对条件进行建模,例如: interface Expression { public T Evaluate(Context context); } 类 OrExpression : 表达式 { Expressionleft; 表达权;} 类 AndExpression : 表达式 { Expressionleft; 表达权;} 类 IfExpression : 表达式 { 表达式条件;表达式然后从句;表达式其他子句;} 类 EqualExpression : 表达式 { 表达式左; 表达权;} 类 ContextVariableValue : 表达式 { }
“如果客户已经注册至少 2 个月,并且在购买期间他的订单价值超过 150 美元,或者产品 A 或 B 已经在他的购物车中,那么向他展示这个广告”</p>
会是这样的:
var clientIsAlreadySignedUpFor2Months = new GreaterThanExpression(new ContextVariableValue("ClientSignedUpLengthInMonths"), new ConstantExpression(2)); var purchaseExceeds150 = new GreaterThanExpression(new ContextVariableValue("PurchaseAmount"),new ConstantExpression(150)); 新的IfExpression(新))
var result = new AndExpression(clientIsAlreadySignedUpFor2Months, purchaseExceeds150, 等等...)
要将其存储在数据库中,您可以将它们序列化为文本等方程式,然后解析它们,或者您可以使用类似的东西
条件 Id 类型 ParametersType Operand1 Operand2 1 GreaterThanExpression Number 2 3 2 ContextVariableValue Number ClientSignedUpLengthInMonths null 3 ConstantExpression Number 2 null
ETC...
我认为您最好的选择是将所有广告及其条件预加载到内存中,并在每次可以显示添加时运行它们...
如果您检测到很多添加具有“相似”条件,那么您可以添加一些逻辑来仅评估这些条件一次,以加快速度等......