封装异步Web服务通信的正确方法

时间:2010-07-21 19:44:14

标签: c# silverlight web-services design-patterns asynchronous

我通常会尝试在我的客户端应用程序中封装我的Web服务调用。

而不是这样做:

public Guid FindUserIDSelected(string userName)
{
    MyWebServiceReference service = new MyWebServiceReference(GetEndpointBasedOnEnv(Env));
    return service.GetUserIDFromName(userName);
}

我有一个静态类,它封装了与Web服务的通信。它通过确定环境(以及其他此类事物)来处理端点解析。

所以上面的代码改变如下:

public Guid FindUserIDSelected(string userName)
{
    return Communication.GetUserIDFromName(userName);
}

但现在我遇到了问题。 Silverlight仅支持异步调用(至少就我所见)。因此,调用Web服务然后在封装的调用中返回值不起作用。

我能想到的最好的方法是传递一个在Communication类中用于已完成事件的委托:

private Guid foundUserID;

public void FindUserIDSelected(string userName)
{
    Communication.GetUserIDFromName(userName, GetUserIDCompleted);
}

private void QuestionRecieved(object sender, GetUserIDFromNameCompletedEventArgs e)
{
    foundUserID= e.Result();
}

这有几个问题(在我看来)。

  1. 我现在已经破解了封装的Web服务元素(完成的调用实际上是Web服务返回。我不希望其余的类必须关心服务)。
  2. 我不得不在班级公开我的结果(foundUserID)。
  3. 我太僵硬了吗?这够好吗?还有更好的方法吗?

    我是唯一有这个问题的人吗?

1 个答案:

答案 0 :(得分:0)

在我看来,最好从你的沟通课中使用 eventing ,特别是如果你有像 [EventAggregator] 1这样的东西,那么您可以根据您的具体参数过滤事件

以下是代码段,这可能对您有所帮助。

  

公共静态类通信       {

    public static event EventHandler<MyEventArgs> ServiceCallComplete;

    public static void InvokeMyAcionComplete(MyEventArgs e)
    {
        EventHandler<MyEventArgs> handler = ServiceCallComplete;
        if (handler != null) handler(null, e);
    }

    public static void CallService ()
    {
        //Performed async call  

        // Fire the event to notify listeners
        OnServiceCalled();
    }

    private static void OnServiceCalled ()
    {

        InvokeMyAcionComplete(new MyEventArgs());

    }



}

public class  ClientCode
{
       public void CallService()
       {
           Communication.CallService();

           //Subscribe to the event and get notified when the call is complete
           Communication.ServiceCallComplete += OnServiceCalled;
       }

    private void OnServiceCalled(object sender, MyEventArgs e)
    {
            //MyEventArgs is your customized event argument

            //Do something with the result  
    }
}

希望这个帮助