确保仅在另一个方法成功完成时才运行方法

时间:2011-03-02 13:26:00

标签: c#-4.0 delegates

我正在使用网络服务来更新我在第三方数据库上的一些用户信息 这个信息通常也需要在我的数据库上更新(我知道这听起来不太好,但我无能为力......)。 最近我们开始在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方法名称,每个方法的参数....正如你所看到的那样,这是一种非常尴尬的方式。

有更整洁,更优雅的方式吗?

感谢。

1 个答案:

答案 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!
    }
});