Come recuperare i dati in base all'ID dal codice più pulito?

1

Sto lavorando all'applicazione client-server. L'architettura client (gerarchia di classi) ha il seguente aspetto:

  • System (il nome è ovviamente diverso, più descrittivo) - rappresenta l'intero sistema
    • Module A : un'istanza di classe che rappresenta un modulo. Un modulo = gruppo di dati e operazioni simili
    • User Module - un altro modulo
      • Users - istanza di classe che rappresenta la raccolta di utenti, consente di aggiungere, rimuovere, leggere, ecc.
      • Groups - rappresenta i gruppi di utenti
    • ecc.

L'architettura sopra rappresenta il sistema, i dati, le operazioni. Gestisce le richieste dei client e le risposte del server. Richiede le query nella cache se necessario. Ma NON gestisce la GUI, per questo uso codice separato. La maggior parte delle GUI utilizza la vista per la visualizzazione di dati che si basa su una logica semplice: un tipo di vista (classe) rappresenta una vista di un tipo (singolo) di un elemento. Ad esempio UserView visualizza i dati sull'utente (dall'istanza User ).

Spesso l'oggetto rappresenta una collezione di oggetti. Ad esempio, potrebbe esserci una voce come UserEvent che contiene un nome (dell'evento), una data e un elenco di utenti. Tuttavia, l'elenco degli utenti è implementato come lista di ID ( UserId ), niente di più. Quindi ora UserEventView prende questo elenco e vuole creare istanze di UserView per visualizzare informazioni più dettagliate sugli utenti (ad esempio come elenco di nomi). Quindi ora UserEventView deve accedere a Users per tradurre UserId in User per fornire dati corretti di UserView . Quindi, qual è il modo migliore per UserEventView di accedere a Users ?

Posso vedere diversi modi su come risolverlo, ma nessuno sembra essere l'ideale:

  • Singleton - il modo più semplice e più semplice. Qualunque sia il System (anche se UserEvenView non se ne preoccupa) o per ogni singolo modulo.
  • Users istanza è data a UserEventView dal suo genitore, che è fornito dal suo genitore, che è fornito dal suo genitore, ...
  • C'è un componente UsersProvider collegato a UserView che cerca la radice della GUI dove cerca un componente che fornisce l'istanza System e ottiene Users da esso.

Note:

  • Se vuoi suggerire qualche eccezione nel design per gli utenti, immagina che io lavori con auto, scarpe, qualsiasi cosa.
  • L'app è scritta in C # / C ++.
posta Tom 08.06.2018 - 10:52
fonte

1 risposta

1

Crea un repository per racchiudere in qualunque negozio gli utenti con i metodi appropriati

IUserRepository
{
    GetUserById(string id);
}

Installa un'istanza concreta di questo nella radice della tua app

class System
{
    public void Main(string[] args)
    {
        var repo = new MyUserRepo();
        ....
    }
}

e passalo in un oggetto che ne ha bisogno tramite i parametri di costruzione. vale a dire.

class UserViewModel
{
    public UserViewModel(IUserRepository repo)
}

Ora i tuoi vari ViewModels e / o Controller etc possono ottenere utenti senza essere strettamente collegati al resto dell'App.

Nota: Sebbene questo pattern sia solitamente utilizzato per avvolgere un database, non c'è alcun motivo per cui non puoi includere un elenco o un dizionario di utenti in memoria

    
risposta data 08.06.2018 - 13:14
fonte