Come evitare l'inquinamento della logica con proprietà asincrone pigri

2

Per poter scalare vorrei usare la programmazione asincrona. Funziona molto bene se devo leggere qualcosa da db e spingere al frontend, tuttavia non so come usarlo correttamente in blob di logica buniess che vivono le loro vite. Ho un oggetto, che ha molte proprietà che dovrebbero essere pigri. Ad esempio, classe di ordine con destinatario, pagatore, indirizzo di consegna, ecc. Raggruppa servizi che leggono qualcosa in base a orderId.

In passato avrei fatto: Payer payer = order.Payer; - controllerebbe la cache delle richieste e la base di query secondo necessità. Comunque ora ho Payer payer = await order.Payer() e lo odio. Costringe tutto il mio codice logico ad essere asincrono (perché nel software di contabilità Payer deve essere ovunque).

Come risolvere questo problema?

    
posta Shadow 16.09.2016 - 10:53
fonte

3 risposte

4

Non fare cose pigre che non è necessario essere. Se sai che Payer sarà necessario per la maggior parte del tempo, allora non c'è alcun valore nel rendere il caricamento di Payer pigro. Invece, rendi desideroso di costruzioni di Order .

Lazyness è utile solo per le costose cose che potrebbero non accadere o non devono succedere .

Come nota a margine quando si esegue un carico pigro di una proprietà, potrebbe essere utile utilizzare tale carico per recuperare anche le altre proprietà. Ogni carico pigro avrà un sovraccarico significativo. Quindi se stai facendo una richiesta per una proprietà, puoi anche prenderle tutte.

    
risposta data 16.09.2016 - 11:16
fonte
2

Il caricamento lento non deve essere asincrono. Un'implementazione sincrona potrebbe apparire come

Payer _Payer;
public Payer Payer
{
    get
    {
        if (_Payer == null)
        {
            _Payer = LoadPayer();
        }
        return _Payer;
    }
}

Potrebbe includere lock e un altro controllo se _Payer è ancora nullo dopo l'acquisizione del blocco.

D'altra parte, l'idea async è pensata per diffondersi attraverso tutto il tuo codice: vai asincrono fino in fondo, non solo con poche funzioni. Se non ti piace l'idea, vai con l'inizializzazione pigra non asincrona!

    
risposta data 16.09.2016 - 11:16
fonte
1

Solo per aggiungere alla risposta di Bernard, il codice per il caricamento pigro sincrono può essere reso molto più semplice di quello che mostra:

private Payer _payer;
public Payer Payer => _payer ?? (_payer = LoadPayer());
    
risposta data 16.09.2016 - 11:29
fonte

Leggi altre domande sui tag