在wcf ria服务中调用操作

时间:2012-03-12 19:44:56

标签: silverlight asynchronous wcf-ria-services invoke

我在wcf ria service.like中使用了一些调用操作方法,如下面的方法:

    [Invoke]
    public int GetCountOfAccountsByRequestId(long requestId)
    {
        return ObjectContext.Accounts.Count(a => a.RequestId ==requestId);
    }

当我想从此方法获取数据时,我使用以下代码运行并从invoke方法获取值:

        int countOfAccounts = 0;
        InvokeOperation<int> invokeOperation = context.GetCountOfAccountsByRequestId(selectedRequest.RequestId);

        invokeOperation.Completed += (s, args) =>
                                         {
                                             if (invokeOperation.HasError)
                                             {
                                                 var messageWindow = new MessageWindow(invokeOperation.Error.Message);
                                                 messageWindow.Show();
                                                 invokeOperation.MarkErrorAsHandled();
                                             }
                                             else
                                             {
                                                 countOfAccounts = invokeOperation.Value;


                                                 if (countOfAccounts == 0)
                                                 {

                                                     // do some thing

                                                 }
                                             }
                                         };

但是这个方法需要大量编码才能运行invoke方法并从中获取值。此代码的一部分也是异步执行的。同样,某些方法必须串联实现。并且每个方法的返回值都是相关的以前的方法。

我该如何实施这项行动?! 如何在没有任何问题的情况下写得比这更好?

1 个答案:

答案 0 :(得分:6)

对于WCF RIA服务,我通常在项目中创建一个服务类,以便在一个地方处理与服务的所有交互。所以我会使用这个服务类来使调用更容易理解和使用。

我将您现有的代码放在一个单独的类中,以便您可以看到它的调用方式。注意:这只是一个例子。 :)

public class ServiceWrapper
{
   ...

   public void GetCountOfAccountsByRequestId(int requestId, Action<int> callback)
   {
      context.GetCountOfAccountsByRequestId(requestId, InvokeComplete, callback);
   }

   private void InvokeComplete<T>(InvokeOperation<T> io)
   {
      var callback = (Action<T>)io.UserState;
      if (io.HasError == false)
      {
          callback(io.Value);
      }
      else
      {
          var messageWindow = new MessageWindow(io.Error.Message);
          messageWindow.Show();
          io.MarkErrorAsHandled();
      }
   }
}

public class YourCode
{
   public void SomeMethod()
   {
      serviceWrapper.GetCountOfAccountsByRequestId(selectedRequest.RequestId, GetCountCompleted);
   }

   public void GetCountCompleted(int countOfAccounts)
   {
      if (countOfAccounts == 0)
      {
         // do some thing
      }
   }

}