Обычно я пытаюсь инкапсулировать вызовы веб-служб в приложениях на стороне клиента.
Вместо того, чтобы делать это:
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();
}
У меня есть несколько проблем (на мой взгляд).
- Теперь у меня есть элементы веб-служб, которые нарушили инкапсуляцию (завершенный вызов - это действительно возврат веб-службы. Iя не хочу, чтобы остальные мои классы заботились об услугах).
- Мне пришлось выставить свой результат (foundUserID) на уровне класса.
Ябыть слишком жестким?Это достаточно хорошо?Есть ли лучший способ?
Я единственный, кто имеет эту проблему?