Modifica del repository durante casi d'uso / Interact in Clean Architecture

1

Sto sviluppando un'app per Android la cui architettura si basa sul ben noto Uncle's Bob Clean Architecture .

Ho il seguente caso d'uso:

Convalida iscrizione utente

Si basa su questa descrizione del caso d'uso (scenario principale di successo)

  1. Verifica se l'avviso di convalida è già stato mostrato

    • Sì - > Vai al passaggio 6

    • No - > Vai al passaggio 2

  2. Verifica se l'utente ha una connessione Internet

    • Sì - > Accedi al repository remoto

    • No - > Accedi al repository locale

  3. Il sistema ottiene l'hash della sottoscrizione dell'utente nel repository

  4. Il sistema genera una chiave per decrittografare l'hash dell'abbonamento

  5. Il sistema decodifica l'hash utilizzando la chiave generata in precedenza e restituisce lo stato dell'abbonamento ( valido / non valido )

    • Lo stato è valido: il sistema salva l'abbonamento sul dispositivo e modifica il tipo di utente in Premium

    • Lo stato non è valido: il sistema salva l'abbonamento sul dispositivo cambia il tipo di utente su Libero

  6. Il caso d'uso termina

Sto affrontando un problema nel passaggio 2. Come puoi vedere, ho bisogno di cambiare il mio repository durante l'esecuzione del caso d'uso, ma non conosco il modo migliore per implementarlo.

Una delle mie idee era di iniettare il repository attraverso il metodo injection (usando una sorta di setRepository(Repository repository ) invece dell'iniezione del costruttore. Va bene?

    
posta Rômulo.Edu 05.11.2016 - 19:54
fonte

1 risposta

1

Prova un proxy che ha il repository remoto e locale come dipendenze e usa quello necessario. Ecco un'implementazione in C #

public class ProxyRepository : IRepository

{
    private readonly IRepository _remoteRepository;
    private readonly IRepository _localRepository;

    public ProxyRepository(IRepository remoteRepository, IRepository localRepository)
    {
        _remoteRepository = remoteRepository;
        _localRepository = localRepository;
    }

    public byte[] GetUserHash(Guid userId)
    {
         if (ThereIsAnInternetConnection())
              return _remoteRepository.GetUserHash(userId);
         else
              return _localRepository.GetUserHash(userId);
    }

    private bool ThereIsAnInternetConnection()
    {
        // your implementation of this, you might want to cache this call
    }
}
    
risposta data 07.11.2016 - 06:13
fonte

Leggi altre domande sui tag