使用Windows Workflow Foundation(WF)作为展示规则引擎是否明智?

3
我正在开发一个n层应用程序,需要在表示层上使用规则引擎。
我需要将显示规则从数据库加载到BLL层,并传递给客户端。例如,当propertyX为true时,项目A以红色轮廓显示;当propertyY为true时,以白色轮廓显示,并且当两者都不为true且您没有管理员角色时,应该隐藏它。
BLL最终将成为规则驱动的,但我们将首先从现有的客户端/服务器应用程序中迁移硬编码逻辑到那里。
看起来WF允许我创建和序列化工作流程,我可以在BLL或表示层上托管。
我预计会有大量规则,因为不同的用户角色会为50多种实体类型的表示层获取略微不同的规则集。
这是个好主意吗?
是否更简单地定义DSL并自己管理?
2个回答

4
有两件事情你需要知道。
首先,请记住,工作流基础是针对在后台运行的非常长时间的过程进行优化的,并且它是同步的,一个活动必须等待前一个活动完成。
尽管你可以在.NET 4中执行并行工作流活动,但执行始于同步状态。这将为你的应用程序增加更多的服务层,因为WF需要WCF层来很好地通信,超出了其项目边界。
请参阅MSDN上的此工作流基础概述: Workdlow Foundation overview http://i.msdn.microsoft.com/dynimg/IC102288.gif 其次,大量规则的工作流将会在长期内降低性能,除非你确实需要长时间运行的过程,例如必须等待具有正确特权(或职位)的正确人员批准的批准工作流程。工作流基础在这方面非常出色,特别是在.NET版本4及以上。
这是Workflow Foundation 4的概述: MSDN Library of .NET 4 Workflow Foundation Overview ,你可以从那里开始。
当在WPF中使用时,你必须异步调用工作流服务,否则它将阻塞WPF UI线程。
你可以进一步使用下一个版本的.NET 4.0的新Async API,但这只是一种语法糖,以便更轻松地使用总是让人头痛的异步编程。
因此,我不建议Workflow Foundation作为业务规则验证器。你可以简单地使用Entity Framework 4中的数据注释的强大功能,从你的物理数据库映射到你的业务实体层,然后进一步重新建模以添加业务逻辑和规则,并且速度更快。
如果你坚持要使用,则必须在WCF服务中使用异步代码来实现复杂回调的工作流。

我不确定我已经清楚地表达了我想做的事情。基本上,计划是将序列化的工作流传递到演示层,该层可以使用WorkflowInvoker类运行它们。特定演示对象的工作流的输入和输出只会查看本地属性包,工作流会通过集合更改通知来触发。管理异步调用不是问题,因为我们在演示层中已经有了机制。我不需要持久化工作流。 - LukeN
“passed serialized workflow”是什么意思?正如我之前所说,WPF线程和WorkflowInvoker线程是不同的。 如果您想基于ObservableCollection的集合更改触发工作流程,则WPF线程和WorkflowInvoker的往返仍然很昂贵,而如果您真的意味着用工作流程来验证业务逻辑的规则,则相当过度。 - Eriawan Kusumawardhono
目标是将显示规则推送到轻客户端。目前,控制地图上图标显示的逻辑已经硬编码到客户端类中,其中地图上的不同图标根据操作员角色表现不同。这将被一个通用方案所取代,其中我们有一个单一的图标主机参数化,由 BLL 提供规则。如果我们使用 WF,我们将在 BLL 上序列化工作流,并在客户端上反序列化。然后,我们使用 WorkflowInvoker 运行描述图标视觉行为的工作流,给定已传递的属性。 - LukeN
客户端。WorkflowInvoker.Invoke()从调用线程(可能/可能不是我的UI线程)同步运行。如果这将足够高效(考虑到可能出现的大量图标),它让我们以一种好的方式定义这些显示规则,而无需编写自定义规则引擎(好处是它们易于在层之间传递和存储到数据库中)。请注意,调用之间的持久性不是问题。 - LukeN

3

实际上,我认为工作流程对于这种情况是非常合适的。有许多人构建应用程序,在这些应用程序中工作流程在客户端执行,并且我们有良好的支持,其中WorkflowApplication支持后台线程上的工作流程。

事实上,我就是针对这种情况编写了状态机实践介绍。在该应用程序中,一个采用MVVM模式的WPF客户端使用工作流程来控制模拟ATM机的行为。


我想我会进一步调查这个问题,谢谢Ron! 你有这方面的性能概况吗?如果我有数百个用户怎么办? - Eriawan Kusumawardhono
如果您在客户端执行业务规则,则用户数量就变得不那么重要了。然后,只需要从数据库中检索业务规则,这不应该成为问题。 - Ron Jacobs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接