【问题标题】:Making sure a method is run only if another method has completed successfully确保仅在另一个方法成功完成时才运行一个方法
【发布时间】:2011-08-30 17:10:25
【问题描述】:

我正在使用网络服务来更新我在第三方数据库上的一些用户信息。
这个信息通常也需要在我的数据库上更新(我知道这听起来不太好,但我对此无能为力..)。
最近我们开始在 Web 服务的数据库和我们的本地数据库之间遇到各种差异问题,所以现在我正在寻找一种方法来确保只有在 Web 服务调用返回成功时才更新我的本地数据库。
这样做的一个主要问题是 Web 服务可能会以多种方式返回成功(例如 bool、enum 等),当然每种方法都有不同的签名。

例如:
我有 Web 服务方法,例如:

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 方法名称、每个方法的参数。 .. 如您所见,这是一种非常尴尬的做法。

有没有更整洁更优雅的方式?

谢谢。

【问题讨论】:

    标签: c#-4.0 delegates


    【解决方案1】:

    像这样为您的网络服务创建一个帮助类:

    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();
                }
            }
        }
    }
    

    然后在您的代码中调用您的网络服务:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多