Вызвать операцию в сервисе wcf ria - PullRequest
1 голос
/ 12 марта 2012

Я использую некоторый метод операции 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 Ответ

6 голосов
/ 13 марта 2012

Для сервисов 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
      }
   }

}
...