WF,WCF和声明性服务(或者:微软的“声明式”是什么意思?)

时间:2009-07-27 11:44:41

标签: wcf workflow-foundation declarative

我已经制作了这个社区Wiki,因为有些人可能会认为这是开放的辩论,其他人可能会认为这是一个用词来表示他们真正意义的问题(换句话说,这是一个意见问题,这是一个意见问题)。

有一个general question on SO about declarative programming,它有一些很好的答案。

但我被this blog post的微软传道者抛出了一点点。

  

声明的一个优点   编程是你可以指出的   你想做什么,但不怎么做   这样做。

到目前为止,这么好 - 事实上,这与SO问题上接受的答案完全一致。

但是请查看有关“服务实施”的部分,

  

你可以   只看几十行xaml   代码并能够确定如何   WCF服务配置和如何   相应的工作流程已定义。

看了一些例子,让我简单回答一下,说“不,我做不到”。但不是轻率地解雇这些东西,而是look at the docs

这需要一段时间,但最后reality has caught up with satire ......但这不是重点 - 当然他们并没有认真地建议这样做来揭露像添加这样的微不足道的事情。我也不是在抱怨荒谬的冗长,以及任何人都会手写这样的东西的奇怪想法 - 它看起来更像编译器的输出而不是人类可读的语言。

对我来说,难题是声称这是“声明性的”。然而,它的核心是任务陈述。

There's more here

  

定义声明性服务   在XAML中以声明方式提供   另一层抽象。   基本上,你创建了一个模型   通过定义你想要的东西来服务   服务要做而不是怎么做   它。可以定义整个服务   以声明的方式,包括   执行行动。

因此,如果我们三次声明声明性声明性,那么这就是声明性的。疑难杂症。如果我们说出“你想做什么而不是怎么做”的神奇短语,那么我们可以忽略一点,在下一句话中,我们将指定“操作的实施”,所以我们我将准确地说明如何做到这一点。

该页面中的示例是:

<wma:Sequence>
    <wma:WriteLine Text ='[String.Concat(String.Concat(String.Concat(String.Concat("Add(", CType(op1, Object)), ","), CType(op2, Object)), ") called")]' />
    <wma:Assign x:TypeArguments="xs:Int32" To="[result1]" Value="[op1 + op2]" />
</wma:Sequence>

也就是说,整个事情(包括我从WF示例中删除的大量垃圾)恰好相当于:

void Add(int op1, int op2, out int result1)
{
    Console.WriteLine("Add(" + op1 + ", " + op2 + ") called");
    result1 = op1 + op2;
}

所以 - 一个语句块,按照它们出现的顺序执行,并有副作用。当然还有用于循环的工作流活动元素(如果WF还没有您最喜欢的命令声明,您可以编写自己的活动)。显然,“以不可读的格式重写代码”与“添加一个抽象层”是一回事。

重申一下,这并不是我抱怨的疯狂难以理解的冗长 - 事实上,在服务实现中发生了图灵完整的命令式编程,那么重点是什么呢?在您了解之前,我们将逐步完成调试器中的工作流程,尝试找出哪个赋值语句突变了哪个值,或者为什么循环将永远循环。

(具有讽刺意味的是,在C#版本中,它更具说明性,因为我们没有指定如何连接字符串,从而允许编译器生成更少的Concat方法调用。)

用XML编写内容使其具有声明性(以及不太可读)吗?

2 个答案:

答案 0 :(得分:3)

另一种认识是,在交换格式以外的容量中使用XML会耗费大量时间。

WCF中的服务“定义”从第一天开始声明。但是,将接口定义与服务定义分开(我的意思是ServiceContractAttribute等)是IMO的好事。但是,使用XML作为编程语言确实很糟糕。

在查看这些XML文档时,我个人觉得可以解释纯恐怖的攻击。<​​/ p>

答案 1 :(得分:0)

Windows Workflow Foundation的一部分未经过太多讨论(在Microsoft之外),可能会为您澄清这一点。

如果您创建一个Workflow项目,并在工具箱中查看,您将看到大量可以拖动到设计图面上的“框和线”。您可能会觉得您打算使用这组工具创建工作流程。事实并非如此。

您需要创作特定于您的问题域的自定义活动。这些是通过各种开箱即用的活动连接起来的。这些可能是相当高级别的活动 - 例如“评估保险单”或“记录患者住院”。

声明性工作流程(或服务)将声明如何将您可用的特定于问题的活动组合在一起。