Убедитесь, что метод запущен, только если другой метод успешно завершен - PullRequest
0 голосов
/ 02 марта 2011

Я использую веб-сервис для обновления информации некоторых моих пользователей о сторонних БД.
Эту информацию обычно необходимо обновлять и на моей БД (я знаю, что это звучит не очень хорошо, ноничего не могу с этим поделать ..).
Недавно у нас начались всевозможные проблемы несоответствия между базой данных веб-службы и нашей локальной базой данных, поэтому теперь я ищу способ убедиться, что моя локальная база данных только обновленаесли вызов веб-службы возвратил успех.
Основная проблема заключается в том, что веб-служба может возвращать успех многими способами (например, 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 голосов
/ 30 августа 2011

Создайте вспомогательный класс вашего веб-сервиса следующим образом:

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!
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...