1

作为初学者,我一直在深入研究 Windows Workflow 4.5 的技术细节和实现,并取得了不错的成果。我的问题更多是“为什么以及何时”与“如何”的问题,所以请耐心等待。

我把一个大家都熟悉的概念,把业务逻辑抽象成WF,即通用登录流程。我想要完成的是拥有可以从 MVC 网站、Windows 窗体应用程序等调用的可重用逻辑,并且让所有内容都通过相同的工作流程运行,我已经实现了。

现在我有 2 个关于“何时”应用 WF 和何时使用代码的概念性问题。

1 - 以简单验证为例。我正在尝试登录,但我传递了一个空的用户名或密码字符串。显然,我想将消息发送回最终用户“需要用户名”和“需要密码”,我已经完成了。现在,我这样做的方式是我有一个验证类(FluentValidation NuGet 包,如果重要的话),但重要的是我在代码中这样做。因此,在 WF 中,我通过 ExecuteMethod 调用我的验证代码,一切正常。我的问题是:这是 WF 思维方式的错误方法吗?我应该执行内联 WF“如果”操作/决策并直接在 WF 内部构建验证消息,而不是调用一些代码块?一世' 我不仅要求验证,而且作为一个我们都可以涉及的概念,但更一般地说,我应该尝试将任何东西和我能做的一切都放入 WF 本身,还是调用自定义代码更好?如果可能的话,我正在寻找更多来自具有 WF 经验的经验丰富的软件架构师的推理的最佳实践,而不是某人的意见。

2 - 在另一台机器上选择工作流程。因此,同一登录工作流活动的一部分需要服务方法调用。我以这样一种方式编写代码和工作流,即工作流接收 ILogOnService 的 In 参数,该参数具有接口方法“AuthenticateUser”。我传入的具体实现是异步调用 MVC4 Web Api post 方法,以执行标准的 Asp.Net 成员资格 ValidateUser。同样,我应该从 WF 工作流程中调用这个 Web Api PostAsync 吗?如果是这样,这不是将我的工作流程与 Asp.Net Membership 和我的特定服务选择紧密结合。似乎有办法让工作流达到某个点,然后在另一台机器上恢复进程,例如服务正在运行的地方,然后继续这个过程,但我

只是从这项技术的专业人士那里寻找一些指导方针和想法,但我会选择最有用的答案。

4

1 回答 1

2

使用 C# 代码来实现工作流的细节并没有错。事实上,我总是告诉人们,如果他们仅使用标准的开箱即用活动来使用 WF4,他们可能做错了事。您确实需要创建或让其他人为您创建自定义活动,为您的业务建模业务活动。现在,如果这意味着创建一个使用 FluentValidation 验证登录的活动,那就太好了。另一次,您可能会从较低级别的 WF4 活动中构建更高级别的业务活动,只需将它们组合起来,以最适合您的情况。

如果您知道该操作是短暂的并且通常可用,则使用 PostAsync 之类的服务调用服务可以很好地工作。然而,当您进入 SOA 风格时,您真的想开始使用时间解耦因此,一项服务不依赖于另一项立即可用的服务。当你进入时间解耦时,你真的想使用队列,也许是 MSMQ 或者其他类似的技术。因此,在这种情况下,您真的想用响应队列发送单向消息,并且工作流必须空闲并等待响应消息到达。这将重新加载工作流,可能在另一台机器上。现在这可能并不总是合适的,例如在您的登录中,由于会员服务不可用,因此在一天后授予登录并没有多大用处,但可以导致非常可扩展和容错的系统。当然,没有免费的午餐,因为这些系统很难正确设计。

于 2013-03-04T20:32:57.477 回答