我通常会尝试在我的客户端应用程序中封装我的Web服务调用。
而不是这样做:
public Guid FindUserIDSelected(string userName)
{
MyWebServiceReference service = new MyWebServiceReference(GetEndpointBasedOnEnv(Env));
return service.GetUserIDFromName(userName);
}
我有一个静态类,它封装了与Web服务的通信。它通过确定环境(以及其他此类事物)来处理端点解析。
所以上面的代码改变如下:
public Guid FindUserIDSelected(string userName)
{
return Communication.GetUserIDFromName(userName);
}
但现在我遇到了问题。 Silverlight仅支持异步调用(至少就我所见)。因此,调用Web服务然后在封装的调用中返回值不起作用。
我能想到的最好的方法是传递一个在Communication类中用于已完成事件的委托:
private Guid foundUserID;
public void FindUserIDSelected(string userName)
{
Communication.GetUserIDFromName(userName, GetUserIDCompleted);
}
private void QuestionRecieved(object sender, GetUserIDFromNameCompletedEventArgs e)
{
foundUserID= e.Result();
}
这有几个问题(在我看来)。
我太僵硬了吗?这够好吗?还有更好的方法吗?
我是唯一有这个问题的人吗?
答案 0 :(得分:0)
在我看来,最好从你的沟通课中使用 eventing ,特别是如果你有像 [EventAggregator] 1这样的东西,那么您可以根据您的具体参数过滤事件
以下是代码段,这可能对您有所帮助。
公共静态类通信 {
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
}
}
希望这个帮助