在wcf ria服务中调用操作

Hos*_*nia 1 silverlight asynchronous invoke wcf-ria-services

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

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

当我想从这个方法获取数据时,我使用以下代码运行并从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

                                                 }
                                             }
                                         };
Run Code Online (Sandbox Code Playgroud)

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

我该如何实现这个动作?!我怎么能写得比没有任何问题更好?

Bry*_*ant 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
      }
   }

}
Run Code Online (Sandbox Code Playgroud)