2009-10-26 136 views
0

当编写一个Silverlight应用程序连接到WCF Web服务时,我们在使用Web服务时唯一提供的选项是对WS接口进行异步调用。异步Web服务设计模式

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? 
} 

虽然我写的webapps当(安全网)了解异步调用的原因,将一个其中每个步骤是依赖的结果,使用什么类型的设计模式,如果一个方法是写Web服务调用?例如,如果在Web服务中有一种方法检查访问者的用户凭证,并且取决于该用户的组,则会执行某些操作。

public MyPage() //Constructor 
{ 
    CheckCredentialsAsync(); 

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

} 

有没有办法做到这一点,而不使用由先前的异步调用完成的事件引发了“多米诺骨牌”的方法设计?看起来如果有很多客户/服务交互可能会变得混乱。

谢谢!

回答

4

我知道这种模式的最佳建模是事件驱动的有限状态机。异步方法完成是事件,您的“复杂操作”是操作,MyPage实例是当前状态。然而,对于任何相当数量的状态和事件,FSM可能会相当多毛,虽然他们可以通过组合更简单的FSM进行检查,但我不会将这种模式直观而简单地称为任何延伸。

坦率地说,我经常更喜欢你描述的回调链。 “多米诺骨牌效应”并不是非常糟糕,一旦你写了一些这样的模块,你就会掌握它。它的复杂性基本上是由'复杂的'块中可能的执行分支的数量所驱动的。在同步路径中,如果您有一个if分支,那么在异步路径中,您可能会有两个单独的回调。更多的代码需要输入,但并不是很难理解。而'更多的代码'部分可以照顾正确的coe工厂成为助手。

我认为虽然我没有使用Silverlight类,但我的经验主要围绕WebRequest,SqlClient和Stream操作的异步行为。最后,我发现最复杂的部分是错误处理和资源所有权的分割,因为using模式对于异步来说远没有用处。

0

我同意你的观点:
在呼叫的长骨牌链看是丑陋的。它混淆了代码,因为在您的页面中调用回调的(无穷尽的)列表不一定与其他开发人员通信,因为给定系列是任何单个集合的一部分。这就是为什么我会使用设计模式将这些调用包装到单个对象中。

如果您的多米诺骨牌连锁电话...

使用以前的电话的数据:
我将包裹这些调用到使用DECORATOR屈尊图案的物体。一个使用装饰模式的例子是STREAM对象。

如果调用您的多米诺骨牌链...

不使用以前的调用数据:
我将这些调用包装到使用CHAIN OF RESPONSIBILITY屈尊图案的物体。

无论其
有很多原因,你可能使用或不使用一个或最等。我只是想迎合你的具体情况。 Here is how you decide which one to use.