Правильный способ инкапсуляции асинхронных коммуникаций веб-сервисов - PullRequest
1 голос
/ 21 июля 2010

Обычно я пытаюсь инкапсулировать вызовы веб-служб в приложениях на стороне клиента.

Вместо того, чтобы делать это:

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

У меня есть статический класс, который инкапсулирует связь с сетьюСервисы.Он обрабатывает разрешение конечной точки посредством определения среды (и других подобных вещей).

Таким образом, приведенный выше код изменяется так:

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

Но теперь у меня возникла проблема.Silverlight поддерживает только асинхронные вызовы (по крайней мере, насколько я вижу).Поэтому вызов веб-службы, а затем возврат значения в инкапсулированном вызове не работает.

Лучшее, что я могу придумать, это передать делегат, который используется в классе Communication для завершенного события:

private Guid foundUserID;

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

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

У меня есть несколько проблем (на мой взгляд).

  1. Теперь у меня есть элементы веб-служб, которые нарушили инкапсуляцию (завершенный вызов - это действительно возврат веб-службы. Iя не хочу, чтобы остальные мои классы заботились об услугах).
  2. Мне пришлось выставить свой результат (foundUserID) на уровне класса.

Ябыть слишком жестким?Это достаточно хорошо?Есть ли лучший способ?

Я единственный, кто имеет эту проблему?

1 Ответ

0 голосов
/ 30 апреля 2011

По моему мнению, лучше использовать eventing из вашего класса общения, особенно если у вас есть что-то вроде [EventAggregator] 1 , поэтомувы можете отфильтровать событие на основе вашего конкретного аргумента

Ниже приведен фрагмент кода, это может быть полезно для вас.

открытый статический класс Communication {

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

Надеюсь, эта помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...