Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 异步Web服务设计模式_.net_Design Patterns_Web Services_Asynchronous Wcf Call - Fatal编程技术网

.net 异步Web服务设计模式

.net 异步Web服务设计模式,.net,design-patterns,web-services,asynchronous-wcf-call,.net,Design Patterns,Web Services,Asynchronous Wcf Call,在编写连接到WCF Web服务的Silverlight应用程序时,我们在使用Web服务时看到的唯一选项是对WS接口进行异步调用 i、 e 有没有一种方法可以实现这一点,而不必使用以前异步调用completed事件触发的方法的“domino”设计?如果存在大量的客户机/服务交互,似乎会变得一团糟 谢谢 我所知道的这种模式的最佳建模是事件驱动有限状态机。异步方法是事件,而“复杂操作”是动作,MyPage实例是当前状态。然而,对于任何数量的状态和事件,FSM都是非常复杂的,尽管它们可以通过组合更简单的

在编写连接到WCF Web服务的Silverlight应用程序时,我们在使用Web服务时看到的唯一选项是对WS接口进行异步调用

i、 e

有没有一种方法可以实现这一点,而不必使用以前异步调用completed事件触发的方法的“domino”设计?如果存在大量的客户机/服务交互,似乎会变得一团糟


谢谢

我所知道的这种模式的最佳建模是事件驱动有限状态机。异步方法是事件,而“复杂操作”是动作,MyPage实例是当前状态。然而,对于任何数量的状态和事件,FSM都是非常复杂的,尽管它们可以通过组合更简单的FSM以某种方式进行控制,但我不认为这种模式直观且简单

坦率地说,我通常更喜欢你描述的回调链。“多米诺”效应并不一定是坏的,一旦你写了两个像这样的模块,你就掌握了窍门。它的复杂性基本上是由“something complex”块中可能的执行分支的数量驱动的。在同步路径中有一个if分支,在异步路径中可能有两个单独的回调。输入的代码更多,但不一定更难理解。而“更多代码”部分可以由coe的适当工厂处理成助手


虽然我没有使用Silverlight类,但我的经验主要是WebRequest、SqlClient和流操作异步行为。最后,我发现最复杂的部分是错误处理和资源所有权的分离,因为
使用
模式对异步的用处要小得多。

我所知道的此类模式的最佳建模是事件驱动有限状态机。异步方法是事件,而“复杂操作”是动作,MyPage实例是当前状态。然而,对于任何数量的状态和事件,FSM都是非常复杂的,尽管它们可以通过组合更简单的FSM以某种方式进行控制,但我不认为这种模式直观且简单

坦率地说,我通常更喜欢你描述的回调链。“多米诺”效应并不一定是坏的,一旦你写了两个像这样的模块,你就掌握了窍门。它的复杂性基本上是由“something complex”块中可能的执行分支的数量驱动的。在同步路径中有一个if分支,在异步路径中可能有两个单独的回调。输入的代码更多,但不一定更难理解。而“更多代码”部分可以由coe的适当工厂处理成助手


虽然我没有使用Silverlight类,但我的经验主要是WebRequest、SqlClient和流操作异步行为。最后,我发现最复杂的部分是错误处理的分割和资源所有权的分割,因为
使用
模式对异步的用处要小得多。

如果您不想将回调链接在一起,请查看Jeffrey Richter的AsyncEnumerator:


它也支持Silverlight。

如果您不想将回调链接在一起,请查看Jeffrey Richter的AsyncEnumerator:


它也支持Silverlight。

我同意你的看法:
看着长长的多米诺骨牌呼叫链是很难看的。这会混淆代码,因为页面中的调用和回调(无休止)列表不一定会向其他开发人员传达给定系列是任何单个集合的一部分。这就是为什么我要使用设计模式将这些调用包装到单个对象中。

如果您的domino调用链…

使用以前的通话数据:
我会使用设计模式将这些调用包装到一个对象中。使用decorator模式的一个很好的例子是对象

如果您的domino调用链…

不使用以前的通话数据:
我会使用设计模式将这些调用包装到一个对象中

但是
有很多原因可以解释为什么你可以使用或不使用其中一个。我只是想迎合你的特殊情况。
我同意你的看法:
看着长长的多米诺骨牌呼叫链是很难看的。这会混淆代码,因为页面中的调用和回调(无休止)列表不一定会向其他开发人员传达给定系列是任何单个集合的一部分。这就是为什么我要使用设计模式将这些调用包装到单个对象中。

如果您的domino调用链…

使用以前的通话数据:
我会使用设计模式将这些调用包装到一个对象中。使用decorator模式的一个很好的例子是对象

如果您的domino调用链…

不使用以前的通话数据:
我会使用设计模式将这些调用包装到一个对象中

但是
有很多原因可以解释为什么你可以使用或不使用其中一个。我只是想迎合你的特殊情况。

WebService client = new WebService();
client.ServiceMethodCompleted += new EventHandler<Args>(client_Handler);
client.ServiceMethodAsync();
client.close()

...followed by
void client_Handler(object sender, Args e)
{
    //Next step, possibly another method?
}
public MyPage() //Constructor
{
    CheckCredentialsAsync();

    if(result.IsUserTypeA)
    {
       //something complex
    }
    else if(result.IsUserTypeB)
    {
       //something else complex
    }
    ...etc

}