Il modo migliore per gestire servizi ed eccezioni

1

Ho un'app mobile che consuma un servizio API. Ho una classe per gestire tutte le operazioni (get, post, put) che lanciano eccezioni se il risultato non è 200.

L'app è stata progettata originariamente per essere prevalentemente offline, quindi i miei servizi in questo modo:

        public async Task<bool> GetMailList(int idUser)
        {
            try
            {
                string uri = GlobalSettings.Instance.MailEndpoint + idUser;
                List<MailDto> listaMailDto = await _requestProvider.GetAsync<List<MailDto>>(uri);                    
                await StoreListMailToDB(MapperMail.MapMailList(listaMailDto));
                return true;
            }
            catch (ServiceAuthenticationException ex) 
            {
                Log.CreateErrorLog("Service.35 - ServiceAuthenticationException \n" + ex.ToString());
                DependencyService.Get<IDialogs>().ShowMessage(AppResources.errorBadUser);
                return false;
            }
            catch (HttpRequestExceptionEx ex)
            {
                Log.CreateErrorLog("Service.40 - HttpRequestExceptionEx \n" + ex.ToString());
                DependencyService.Get<IDialogs>().ShowMessage(AppResources.errorNoConection);
                return false;
            }
            catch(Exception ex)
            {
                Log.CreateErrorLog("Service.45 - Exception \n" + ex.ToString());
                DependencyService.Get<IDialogs>().ShowMessage(AppResources.error);
                return false;
            }
        }

Quindi il servizio ottiene i dati e li archivia su Sqlite. Se tutto fosse ok, ritorna vero, se no restituisco falso. E nello schermo chiamo a Sqlite per recuperare i dati.

Il problema arriva ora perché vogliamo cambiarlo in un'applicazione per lo più online. Voglio mantenere la struttura in cui i servizi gestiscono l'eccezione ricevendo i dati al termine della funzione. Voglio qualcosa di simile ma non voglio restituire null

  public async Task<List<MailDto>> GetMailList(int idUser)
        {
            try
            {
                string uri = GlobalSettings.Instance.MailEndpoint + idUser;
                List<MailDto> listaMailDto = await _requestProvider.GetAsync<List<MailDto>>(uri);  
                List<MailBo> listMappead = MapperMail.MapMailList(listaMailDto)                 
                StoreListMailToDB(listMappead);
                return listMappead;
            }
            catch (ServiceAuthenticationException ex) 
            {
                Log.CreateErrorLog("Service.35 - ServiceAuthenticationException \n" + ex.ToString());
                DependencyService.Get<IDialogs>().ShowMessage(AppResources.errorBadUser);
                return null;
            }
            catch (HttpRequestExceptionEx ex)
            {
                Log.CreateErrorLog("Service.40 - HttpRequestExceptionEx \n" + ex.ToString());
                DependencyService.Get<IDialogs>().ShowMessage(AppResources.errorNoConection);
                return null;
            }
            catch(Exception ex)
            {
                Log.CreateErrorLog("Service.45 - Exception \n" + ex.ToString());
                DependencyService.Get<IDialogs>().ShowMessage(AppResources.error);
                return null;
            }
        }

Qualche idea?

    
posta Mulflar 13.03.2018 - 10:54
fonte

1 risposta

1

La best practice quando si chiamano i servizi e falliscono è quella di generare eccezioni e farle esplodere.

  • anche: non utilizzare le variabili globali
  • anche: non fare riferimento direttamente al tuo contenitore DI

es:

public async Task<List<MailDto>> GetMailList(int idUser)
{
    string uri = this.MailEndpoint + idUser;
    var data =  await _requestProvider.GetAsync<List<MailDto>>(uri); 
    return this.mapper.MapMailList(data);
}

async Task MyAppButton_click()
{
    try 
    {
        var data = await this.service.GetMailList(this.userId);
        await this.localRepo.StoreListMailToDB(data)
        mailControl.Data = data;

    }
    catch(Exception ex)
    {
        Log.CreateErrorLog("Service.45 - Exception \n" + ex.ToString());
        this.Dialogs.ShowMessage(ex.Message);
    }
}
    
risposta data 13.03.2018 - 13:59
fonte

Leggi altre domande sui tag