我在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方法并从中获取值。此代码的一部分也是异步执行的。同样,某些方法必须串联实现。并且每个方法的返回值都是相关的以前的方法。
我该如何实施这项行动?! 如何在没有任何问题的情况下写得比这更好?
答案 0 :(得分: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
}
}
}