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.