我想将一组规则应用于业务对象的集合.这些是简单的规则,我不想使用任何现有的业务规则引擎.
我需要为每个规则传递不同的上下文,因此理论上每个规则都可能需要不同的参数.以下是我目前正在做的事情.还有其他/更好的方法吗?
注意:我使用访问者模式进行了评估,但对于这种特定情况似乎付出了太多努力.实际规则并不比我在示例中的规则复杂得多.
interface IParamBase {}
interface IParam : IParamBase
{
string MyProperty {get; set;}
}
class Param : IParam
{
public string MyProperty {get; set;}
}
interface IRule
{
void Setup(IParamBase param);
void Apply(BusinessObject businessObject);
}
class Rule :IRule
{
IParam _param;
public void Apply(BusinessObject businessObject)
{
businessObject.AssignedFromRule = _param.MyProperty;
Console.WriteLine(businessObject.AssignedFromRule);
}
public void Setup(IParamBase param)
{
_param = param as IParam;
}
}
class BusinessObject
{
public string AssignedFromRule {get; set;}
}
void Main()
{
var rule = new Rule();
var param = new Param();
param.MyProperty = "my property";
BusinessObject businessObject = new BusinessObject();
rule.Setup(param);
rule.Apply(businessObject);
}
更新:我忘了向示例添加我需要的向下转发.
最佳答案 您的代码实际上是访问者模式.如果业务对象具有类似BusinessObject.Apply(BusinessRule规则)的方法{rule.apply(this);则更清楚. };
它与完整实现的目的相同:您可以添加操作(业务规则),而无需扩展执行操作的对象(业务对象).
您可能对使用Composite感兴趣,因此您可以将一组规则应用为一个规则.您也可能有兴趣对您在访问者实现中使用的calsses更加明确,但如果它适用于您,请继续使用它.