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

Dan*_*ker 6 wcf declarative workflow-foundation

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

关于声明性编程的SO有一个普遍的问题,它有一些很好的答案.

但是我对微软福音传道者的这篇博文有点不满.

声明性编程的一个优点是,您可以指出您想要做什么,而不是如何做.

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

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

您可以查看几十行xaml代码,并能够确定如何配置WCF服务以及如何定义相应的工作流.

看了一些例子后,让我简单回答一下,说"不,我不能".但是,不要轻率地解雇这些东西,让我们看看文档.

这需要一段时间,但最终现实已经赶上了讽刺 ......但这不是重点 - 当然他们并没有认真地建议这样做来揭露像添加这样的微不足道的东西.我也不是在抱怨荒谬的冗长,以及任何人都会手写这样的东西的奇怪想法 - 它看起来更像是编译器的输出而不是人类可读的语言.

对我来说,难题是声称这是"声明性的".然而它的核心是一个任务声明.

还有更多:

声明性服务在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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

那么用XML写一些东西会使它成为声明性的(以及不太可读)吗?

Ant*_*lev 3

再次承认,在交换格式以外的其他用途中使用 XML 会耗费大量时间。

WCF 中的服务“定义”从第一天起就是声明性的。然而,在我看来,将接口定义与服务定义分开(我的意思ServiceContractAttribute是等)是一件好事。然而,使用 XML 作为编程语言确实很糟糕。

在查看这些 XML 文档时,我个人觉得纯粹的恐怖攻击是可以解释的。