La cache è una dipendenza opzionale?

1

Recentemente, uno dei miei colleghi ha dichiarato che la dipendenza dalla cache dovrebbe sempre essere richiesta. Dovremmo richiederlo nel parametro del costruttore non nullo. E non possiamo usare lo schema di oggetti nulli con esso.

Come portare oltre questo punto di vista? Cosa suggerisci? Come si inserisce la cache nelle tecnologie?

update1: Per cache intendo interfaccia, che può interrogare il valore per chiave, memorizzarlo, determinare è hit / miss e così via. Quindi è una sorta di memoria di backend per link

    
posta gaRex 14.10.2016 - 13:10
fonte

2 risposte

7

Il consiglio PSR-6 sull'interfaccia di caching esprime una visione che personalmente preferisco:

While caching is often an important part of application performance, it should never be a critical part of application functionality.

Pertanto, sono favorevole a considerarlo come una dipendenza facoltativa .

    
risposta data 14.10.2016 - 14:47
fonte
2

No, uno usa una cache o no.

Nella tua applicazione, uno determinerebbe se la memorizzazione nella cache fosse necessaria. Inserirò il caching come pattern di decorazione.

Considera questa interfaccia.

public interface ICommand<in TIn, out TOut>
    {
        TOut Execute(TIn command);
    }

Passiamo qualcosa e otteniamo qualcosa di nuovo. Forse avere qualcosa richiede molto tempo. Quindi, decidiamo di aggiungere il caching.

public class CacheDecorator<TIn, TOut> : ICommand<TIn, TOut>
    {
        private readonly ICache _cache;
        private readonly ICommand<TIn, TOut> _command;
        private readonly string _key;

        public CacheDecorator(string key, ICache cache, ICommand<TIn, TOut> command)
        {
            _command = command;
            _key = key;
            _cache = cache;
        }

        public TOut Execute(TIn input)
        {
            TOut obj;
            if (_cache.Get(_key, out obj))
            {
                Debug.WriteLine(string.Format("Cache hit for key {0}", _key));
                return obj;
            }

            Debug.WriteLine(string.Format("Cache miss for key {0}", _key));
            obj = _command.Execute(input);
            _cache.Set(_key, obj);

            return obj;
        }
    }

Ora qualsiasi comando che restituisce qualcosa può essere memorizzato nella cache. Se non è necessario il caching, il comando non è decorato.

Supponiamo di ricevere un widget e ottenere un widget è costoso:

 public Widget GetWidget(string id)
        {
            var widgetCommand = new WidgetServiceCommand();
            var command = new CacheDecorator<string, Widget>(id, _cache, widgetCommand);
            return command.Execute(id);
        }

Se ottenere i widget non è costoso, basta rimuovere il decoratore e il widget non viene memorizzato nella cache.

    
risposta data 14.10.2016 - 18:10
fonte

Leggi altre domande sui tag