1

我正在对规则引擎的实现进行原型设计,以帮助我们使用订购门户。例如,如果订购了某些商品,则给予商品折扣或要求批准。我们还希望能够为美元金额、用户层次结构添加规则,并将其应用于一个或多个客户。

我觉得 WWF 很好地满足了这一需求。

所有这些都说了,但是我很难弄清楚如何最好地设置一些更复杂的规则。我有一个我觉得最好在 LINQ 查询中描述的“条件”,如下所示:

var y = from ol in currentOrder.OrderLines where ol.ItemCode == "MYITEMCODE" select ol;

我不反对为规则引擎使用不同的框架或向我们的对象添加额外的属性/方法(例如:OrderHasItem(ItemCode)等)以使这些规则更加简化,但我想避免这样做。感觉弄巧成拙,因为它迫使我们走上可能需要更改新规则的代码的道路。

4

2 回答 2

3

是的,您可以将 Linq 查询与 Workflow 一起使用。在 WF 中,您所指的规则是在运行时计算的表达式。您的查询正在根据条件选择有序性的子集。

例如,如果我有一组名称,并且我只想查看以“R”开头的名称。我可以编写以下代码。

private static void ShowQueryWithCode(IEnumerable<string> names)
{
    Console.WriteLine("LINQ Query in Code - show names that start with 'R'");

    // Assuming there are no null entries in the names collection
    var query = from name in names where name.StartsWith("R") select name;

    // This is the same thing as 
    // var query = names.Where(name => name.StartsWith("R"));
    foreach (var name in query)
    {
        Console.WriteLine(name);
    }

    Console.WriteLine();
}

对工作流做同样的事情

步骤 1:使用 IEnumerable 类型的 In 参数创建工作流

在这里你可以看到我添加了 in 参数 在争论中

步骤 2:为 IEnumerable 类型的查询添加一个变量

在添加变量之前,您需要包含一个具有变量的活动。在这个工作流程中,我添加了一个序列。

多变的

第 3 步:为查询分配要使用的 LINQ 表达式 您可以使用方法链或查询语法。

表达

第 4 步:遍历集合

在完成的工作流程中,我使用了 ForEach 活动来迭代名称列表并将它们写入控制台。

工作流程1

此示例在 .NET 4.5 中使用 C#,但同样的技术也可用于 Visual Basic。

您可以在此处下载示例代码

于 2012-07-27T15:43:46.233 回答
0

WF 是一个工作流引擎。它被用来经营工厂和银行。规则引擎只是其中的一小部分。有意义的是,任何正常的 WF 项目都需要一个专门的专业团队来构建它。对于您的特定目的,这似乎是一种矫枉过正。您很可能将自己和您的项目埋没在需求与团队实际技能之间的典型斗争中。

在您的情况下,使用任何可用的 .NET 引擎都会更合理。请记住,构建自定义规则引擎并不是一件容易的事,无论从一开始看起来多么简单。设置类的属性值(通常称为“事实”或“源”对象)或执行操作(调用类的方法)是规则引擎最擅长的。看来这正是您所需要的。查看一些可用的 .NET 引擎。它们很便宜,如果不是免费的,而且可靠。

于 2012-07-26T18:40:41.670 回答