Поиск шаблона проектирования для автоматизации повторяющихся задач, таких как вход / выход - PullRequest
2 голосов
/ 20 сентября 2019

Я ищу шаблон проектирования, который поможет упростить мой код.

Мой код использует HttpClient для вызова веб-API, который получает или публикует информацию, но каждый сеанс требует сначала входа в систему, когда файл cookieвозвращается в качестве идентификатора, и в конце делается вызов для выхода из системы, чтобы закрыть соединение.Итак, мой класс веб-API выглядит следующим образом:

public class APIHelper 
{
    public HttpClient myClient { get; set; }

    public async void Login()
    {
        using (HttpResponseMessage response = await myClient.PostAsync("loginAddress", "loginInput"))
        {
            if (response.IsSuccessStatusCode)
            {                    
                //save cookie
            }
        }
    }

    public async void Logout()
    {
        using (HttpResponseMessage response = await myClient.PostAsync("logoutAddress", ""))
        {
            if (response.IsSuccessStatusCode)
            {                    
                //session ends
            }
        }
    }

    public void GetOrder()  {...}

    public void NewOrder(object OrderData)  {...}

    public void GetCustomer()   {...}

    public void NewCustomer(object CustomerData)    {...}
}

И чтобы использовать их, я бы просто назвал их по порядку:

public Main()
{
    APIHelper.Login();
    APIHelper.GetOrder();   //or NewOrder, or GetCustomer, or any other actual API calls
    APIHelper.Logout();
}

Есть ли в любом случае место для входа / выхода из системы?вызовы внутри каждого из реальных вызовов API, поэтому мне не нужно вводить их для каждого вызова?В идеале мне просто нужно настроить структуру один раз, а затем для любых создаваемых API-вызовов система автоматически вызовет вход / выход из системы в начале / конце.Какой шаблон проектирования решает эту проблему?Любой простой пример был бы очень полезен!

Спасибо.SC

===========================================

Изменить: попробовать предложение Диманоида

Спасибо за быстрый ответ!Я думаю, что это должно работать, но я получил еще одну складку: «Ссылка на объект требуется для нестатического поля, метода или свойства 'APIHelper.GetOrder ()'

Глядя на новый код, кажется,Мне нужен объект myClient (который является объектом HttpClient) в течение сеанса:

public void DoMyJob(Action job)
{            
    var myClient = new APIHelper();     //initiates a HttpClient object

    myClient.Login();
    try
    {       
        job();
    }
    finally
    {
        myClient.Logout();
    }
}

Но при вызове функции задания извне:

DoMyJob(APIHelper.GetOrder);

У меня нетобъект еще есть. Это легко обойти? Извините, я не прояснил это в OP, мой фактический исходный вызов выглядит следующим образом:

var myClient = new APIHelper();
myClient.Login();
myClient.GetOrder();
myClient.Logout();

Но благодаря вашему предложению, я думаю, что лучшепоместите инициализацию внутри метода DoMyJob.

1 Ответ

6 голосов
/ 20 сентября 2019

Используйте шаблонный метод + стратегию для этого.

void DoMyJob(Action job)
{
    APIHelper.Login();
    try
    {
        job();
    }
    finally
    {
        APIHelper.Logout();
    }
}

Использование выглядит следующим образом:

DoMyJob(() => APIHelper.GetOrder()); 

или

DoMyJob(APIHelper.GetOrder); 

или

DoMyJob(() => { APIHelper.GetOrder(); APIHelper.NewOrder(); } ); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...