我正在使用网络服务来更新我在第三方数据库上的一些用户信息
这个信息通常也需要在我的数据库上更新(我知道这听起来不太好,但我无能为力......)。
最近我们开始在Web服务的db和我们的本地数据库之间出现各种差异问题,所以现在我正在寻找一种方法来确保只有在Web服务调用返回成功时才更新我的本地数据库。
这样做的一个主要问题是Web服务可能以多种方式返回成功(例如bool,enum等),当然每个方法都有不同的签名。
例如:
我有像以下网站服务方法:
public bool ChangeDetails(User user)
并且:
public SuccessStatus RemoveUser(long userId)
只有成功完成后才能触发对:
的调用public bool UpdateUserDetails(long userId string userName)
和
public bool RemoveUser(long userId)
(我只是想证明这些方法的分歧......)
我想要做的是通过使用单个方法将每个WS方法“绑定”到db方法的机制(但是可能有更好的方法来确保db的方法只有在WS的时候才会执行方法成功完成)
我解决这个问题的最好方法是编写一个方法,调用它UpdateWSandDB
接收WS方法的委托,它的成功类型(例如bool / enum),它的成功值,db方法名称,每个方法的参数....正如你所看到的那样,这是一种非常尴尬的方式。
有更整洁,更优雅的方式吗?
感谢。
答案 0 :(得分:0)
创建一个Web服务的帮助类,如下所示:
public class ChangeDetailsServiceHelper
{
/// <summary>
/// ChangeDetails
/// </summary>
/// <param name="callback"></param>
public void ChangeDetails(Action<User, Exception> callback)
{
var proxy = new ChangeDetailsServiceClient();
try
{
proxy.ChangeDetailsCompleted += (sender, eventargs) =>
{
var userCallback = eventargs.UserState as Action<User, Exception>;
if (userCallback == null)
return;
if (eventargs.Error != null)
{
userCallback(null, eventargs.Error);
return;
}
userCallback(eventargs.Result, null);
};
proxy.ChangeDetailsAsync(callback);
}
catch (Exception ex)
{
proxy.Abort();
}
finally
{
if (proxy.State != CommunicationState.Closed)
{
proxy.CloseAsync();
}
}
}
}
然后在您的代码中调用您的Web服务:
var changeDetails= new ChangeDetailsServiceHelper();
changeDetails.ChangeDetails((result, error) =>
{
if (result != null && error == null)
{
//everything ok, call next webservice here
//changeDetails.NEXT WEB SERVICE METHOD HERE...
}
else
{
//error occured!
}
});